From edba0970ffd67e7ca8ec5eba3a18b4113a90c705 Mon Sep 17 00:00:00 2001 From: Banana Date: Sun, 25 Dec 2016 19:53:21 +0100 Subject: [PATCH] datalist with suggestion and modified version to allow entries which are not in the list yet. --- .../jquery-flexdatalist-1.8.1.zip | Bin 0 -> 16626 bytes .../jquery.flexdatalist.inspid.js | 1200 +++++++++++++++++ .../flexdatalist/jquery.flexdatalist.min.css | 1 + .../flexdatalist/jquery.flexdatalist.min.js | 1 + webroot/asset/img/insipid.png | Bin 0 -> 108096 bytes webroot/lib/management.class.php | 16 + webroot/view/_foot.php | 1 + webroot/view/_head.php | 1 + webroot/view/home.inc.php | 17 +- webroot/view/home.php | 42 +- 10 files changed, 1266 insertions(+), 13 deletions(-) create mode 100644 source/flexdatalist/jquery-flexdatalist-1.8.1.zip create mode 100644 source/flexdatalist/jquery.flexdatalist.inspid.js create mode 100644 webroot/asset/flexdatalist/jquery.flexdatalist.min.css create mode 100644 webroot/asset/flexdatalist/jquery.flexdatalist.min.js create mode 100644 webroot/asset/img/insipid.png diff --git a/source/flexdatalist/jquery-flexdatalist-1.8.1.zip b/source/flexdatalist/jquery-flexdatalist-1.8.1.zip new file mode 100644 index 0000000000000000000000000000000000000000..7ca37576b69c551239f0eb56ca86398c0d910a97 GIT binary patch literal 16626 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 literal 0 HcmV?d00001 diff --git a/source/flexdatalist/jquery.flexdatalist.inspid.js b/source/flexdatalist/jquery.flexdatalist.inspid.js new file mode 100644 index 0000000..ce224a2 --- /dev/null +++ b/source/flexdatalist/jquery.flexdatalist.inspid.js @@ -0,0 +1,1200 @@ +/** + * jQuery Flexdatalist. + * Autocomplete for input fields with support for datalists. + * + * Version: + * 1.8.0 + * + * Depends: + * jquery.js 1.7+ + * + * Demo and Documentation: + * http://projects.sergiodinislopes.pt/flexdatalist/ + * + * Github: + * https://github.com/sergiodlopes/jquery-flexdatalist/ + * + */ + +jQuery.fn.flexdatalist = function (options, value) { + 'use strict'; + var $document = $(document), + $input = $(this), + input, + _this = this; + +/** + * Each iteration. + */ + input = function () { + var $this = $(this), + _cache = {}, + _previousText = '', + _requestTimeout = null, + _inputName = $this.attr('name'); + + if ($this.hasClass('flexdatalist-set')) { + _this._destroy($this); + } + + /** + * Option management. + */ + $this._options = function (option, _value) { + var _options = $this.data('flexdatalist'); + if (!_this._isDefined(option)) { + return $this.data('flexdatalist'); + } else if (_this._isDefined(_value)) { + _options[option] = _value; + } else if (!_this._isObject(option)) { + return (_this._isDefined(_options, option) ? _options[option] : null); + } else { + _options = option; + } + + _options.searchIn = _this._csvToArray(_options.searchIn); + _options.relatives = _options.relatives && $(_options.relatives).length > 0 ? $(_options.relatives) : null; + _options.textProperty = _options.textProperty === null ? _options.searchIn[0] : _options.textProperty; + _options.visibleProperties = _this._csvToArray(_options.visibleProperties, _options.searchIn); + $this.data('flexdatalist', _options); + return $this; + } + + $this._options($.extend({ + url: null, + data: [], + params: {}, + relatives: null, + chainedRelatives: false, + cache: true, + minLength: 2, + groupBy: false, + selectionRequired: false, + focusFirstResult: false, + textProperty: null, + valueProperty: null, + visibleProperties: [], + searchIn: ['label'], + searchContain: false, + searchEqual: false, + searchDisabled: false, // New + normalizeString: null, + multiple: $this.attr('multiple'), + maxShownResults: 100, + noResultsText: 'No results found for "{keyword}"', + toggleSelected: false, // New + _values: [] + }, options, $this.data()) + ); + + // Handle multiple values + var $_this = $this + .clone(false) + .attr({ + 'list': null, + 'name': null, + 'id': ($this.attr('id') ? $this.attr('id') + '-flexdatalist' : null) + }) + .addClass('flexdatalist-alias') + .removeClass('flexdatalist'); + if ($this._options('multiple')) { + var $ulMultiple = $('
    ') + .addClass('flexdatalist-multiple') + .css({ + 'background-color': $this.css('background-color'), + 'border-color': $this.css('border-left-color'), + 'border-width': $this.css('border-left-width'), + 'border-style': $this.css('border-left-style'), + 'border-radius': $this.css('border-top-left-radius') + }) + .insertAfter($this).click(function () { + $(this).find('input').focus(); + }); + var $li = $('
  • ') + .addClass('flexdatalist-multiple-value') + .append($_this) + .appendTo($ulMultiple); + } else { + $_this.insertAfter($this); + } + $this.addClass('flexdatalist').attr('type', 'hidden'); + + /** + * Initialize. + */ + $this._init = function () { + var _options = $this._options(); + // Listen to parent input key presses and state events. + $_this.on('input keydown', function (event) { + var val = $this._keyword(); + // Comma separated values + if (_this._keyNum(event) === 188 && !_options.selectionRequired && _options.multiple) { + event.preventDefault(); + $this._value(val); + $this._removeResults(); + // Remove results on tab away + } else if (_this._keyNum(event) === 9) { + $this._removeResults(); + // Check if is to remove previous value on backspace key + } else if (val.length === 0 && _options.multiple && _this._keyNum(event) === 8) { + $_this.data('_remove', $_this.parents('li:eq(0)').prev()); + } + }).on('input keyup', function (event) { + if ($this._changed() && _this._keyNum(event) !== 13) { + var keyword = $this._keyword(); + if (keyword.length >= _options.minLength) { + $this._search(function (matches) { + $this._showResults(matches); + }); + } else { + $this._removeResults(); + } + if (!_options.multiple) { + if (!_options.selectionRequired) { + $this._value(keyword); + } else { + $this._value(''); + } + } + } + // Remove previous value on backspace key + var $remove = $_this.data('_remove'); + if ($remove) { + $remove.find('.fdl-remove').click(); + $_this.data('_remove', null); + } + _previousText = $this._keyword(); + }).focus(function () { + var val = $this._keyword(); + if (_options.minLength === 0) { + if (val === '') { + $this._tdata(function (data) { + $this._showResults(data); + }); + } + // Redo search on focus if not selected yet + } else if (val.length >= _options.minLength && !$this._selected()) { + $this._search(function (matches) { + $this._showResults(matches); + }); + } + }) + .attr('autocomplete', 'off'); + + // Respect autofocus attribute + if ($_this.attr('autofocus')) { + $_this.focus(); + } + window.onresize = function (event) { + $this._position(); + }; + $this.addClass('flexdatalist-set'); + } + + /** + * Check if field's text has changed. + */ + $this._changed = function () { + return _previousText !== $this._keyword(); + } + + /** + * Check chained relatives. + */ + $this._chained = function () { + var _options = $this._options(); + if (!_options.relatives || !_options.chainedRelatives) { + return; + } + var toggle = function (init) { + _options.relatives.each(function () { + var disabled = _this._isEmpty($(this).val()), + empty = _this._isEmpty($this.val()); + $_this.prop('disabled', disabled); + if (!init && (disabled || !empty)) { + $this._value(''); + $_this.val(''); + if (_options.multiple) { + $ulMultiple.find('li .remove').click(); + } + } + }); + } + _options.relatives.on('change', function () { + toggle(); + _cache = {}; + }); + toggle(true); + } + + /** + * Process value in input on init. + */ + $this._initValue = function () { + var value = $this.attr('value'); + if (_this._isEmpty(value)) { + return; + } + $this._options('originalValue', $this.val()); + $this._parseValue(value, function (values) { + $this.val('', true); + $_this.val(''); + if (!_this._isEmpty(values)) { + $this._values(values); + } + _previousText = $this._keyword(); + }); + } + + /** + * Parse initial value. + */ + $this._parseValue = function (data, callback) { + var _options = $this._options(); + if ($this._toJSON()) { + try { + callback(JSON.parse(data)); + } catch (e) {} + } else if ($this._toCSV() || typeof _options.valueProperty === 'string') { + var values = data.split(','); + if (typeof _options.valueProperty === 'string') { + var _searchIn = _options.searchIn; + _options.searchIn = _options.valueProperty.split(','); + _options.searchEqual = true; + $this._search(function (matches) { + if (matches.length > 0) { + callback(matches); + } + _options.searchIn = _searchIn; + _options.searchEqual = false; + }, values); + } else { + callback(values); + } + } else { + callback(data); + } + } + + /** + * Get data. + */ + $this._tdata = function (callback) { + $this.trigger('before:flexdatalist.data'); + $this._url(function (remoteData) { + $this._data(function (data) { + data = data.concat(remoteData); + // Check for already set values + var values = $this._options('_values'); + for (var i = 0; i < data.length; i++) { + var item = data[i]; + if (values && values.indexOf($this._getText(item)) > -1) { + delete data[i]; + } + } + $this.trigger('after:flexdatalist.data', [data]); + callback(data); + }); + }); + } + + /** + * Get static data. + */ + $this._data = function (callback) { + var _options = $this._options(); + if (typeof _options.data === 'string') { + $this._remote({ + url: _options.data, + success: function (data) { + var _data = $this._getRemoteData(data); + _options.data = _data; + callback(_data); + } + }); + } else { + callback(_options.data); + } + } + + /** + * Get remote data. + */ + $this._url = function (callback) { + var _options = $this._options(), + keyword = $this._keyword(), + value = $this.val(), + cacheKey = keyword; + + if (_this._isEmpty(_options.url)) { + return callback([]); + } + + clearTimeout(_requestTimeout); + _requestTimeout = setTimeout(function () { + if (_options.cache && _options.cache !== 2) { + cacheKey = keyword.substring(0, (_options.minLength > 0 ? _options.minLength : 1)); + } + + // Check cache + var cachedData = $this._cache(cacheKey); + if (cachedData) { + callback(cachedData); + return; + } + + $this._remote({ + url: _options.url, + data: $.extend($this._relativesData(), _options.params, { + keyword: keyword, + contain: _options.searchContain, + selected: value + } + ), + success: function (data) { + var _data = $this._getRemoteData(data), + _keyword = $this._keyword(); + if (_keyword.length > keyword.length) { + $this._search(function (matches) { + $this._showResults(matches); + }); + } else { + callback(_data); + } + $this._cache(cacheKey, _data); + } + }); + }, 200); + } + + /** + * AJAX request. + */ + $this._remote = function (options) { + // Prevent get data when pressing back button + if ($this.hasClass('flexdatalist-loading')) { + return; + } + $this.addClass('flexdatalist-loading'); + options = $.extend({ + type: 'post', + dataType: 'json', + complete: function () { + $this.removeClass('flexdatalist-loading'); + } + }, options); + $.ajax(options); + } + + /** + * Extract remote data from server response. + */ + $this._getRemoteData = function (data) { + var _data = data.results ? data.results : data; + if (typeof _data === 'string' && _data.indexOf('[{') === 0) { + _data = JSON.parse(_data); + } + if (_this._isObject(_data)) { + return _data; + } + return []; + } + + /** + * Get relatives data. + */ + $this._relativesData = function () { + var relatives = $this._options('relatives'), + data = {}; + if (relatives) { + data['relatives'] = {}; + relatives.each(function () { + var $input = $(this); + data['relatives'][$input.attr('name')] = $input.val(); + }); + } + return data; + } + + /** + * Set datalist data, if exists. + */ + $this._datalist = function () { + var _options = $this._options(), + list = $this.attr('list'); + if (!_this._isEmpty(list)) { + _options.data = []; + $('#' + list).find('option').each(function () { + var val = $(this).val(); + _options.data.push({ + label: val, + value: val + }); + }); + } + return $this; + } + + /** + * Cached data. + */ + $this._cache = function (key, data) { + if ($this._options('cache')) { + key = $this._normalizeString(key); + if (!_this._isDefined(data)) { + if (_this._isDefined(_cache, key)) { + data = _cache[key]; + } + return data; + } + _cache[key] = data; + } + return null; + } + + /** + * Search for keywords in data and return matches. + */ + $this._search = function (callback, keywords) { + $this._tdata(function (data) { + var matches = [], + _options = $this._options(); + // If search disabled, return + if (_options.searchDisabled) { + return callback(data); + } + if (!_this._isDefined(keywords)) { + keywords = $this._keyword(); + } + if (typeof keywords === 'string') { + keywords = [keywords]; + } + $this.trigger('before:flexdatalist.search', [keywords, data]); + for (var kwindex = 0; kwindex < keywords.length; kwindex++) { + var keyword = keywords[kwindex]; + for (var index = 0; index < data.length; index++) { + var _data = $this._matches(data[index], keyword, _options.values); + if (!_data) { + continue; + } + matches.push(_data); + } + } + $this.trigger('after:flexdatalist.search', [keywords, data, matches]); + callback(matches); + }); + } + + /** + * Match against searchable properties. + */ + $this._matches = function (item, keyword, values) { + var hasMatches = false, + _item = $.extend({}, item), + _options = $this._options(), + searchIn = _options.searchIn; + + for (var index = 0; index < searchIn.length; index++) { + var searchProperty = searchIn[index]; + if (!_this._isDefined(item, searchProperty) || !item[searchProperty]) { + continue; + } + var text = item[searchProperty].toString(); + if ($this._find(keyword, text)) { + _item[searchProperty + '_highlight'] = $this._highlight(keyword, text); + hasMatches = true; + } + } + return hasMatches ? _item : null; + } + + /** + * Wrap found keyword with span.highlight. + */ + $this._highlight = function (keyword, text) { + return text.replace( + new RegExp(keyword, ($this._options('searchContain') ? "ig" : "i")), + '$&' + ); + } + + /** + * Search for keyword in string. + */ + $this._find = function (keyword, text) { + var _options = $this._options(); + text = $this._normalizeString(text), + keyword = $this._normalizeString(keyword); + if (_options.searchEqual) { + return text == keyword; + } + return (_options.searchContain ? (text.indexOf(keyword) >= 0) : (text.indexOf(keyword) === 0)); + } + + /** + * Show results. + */ + $this._showResults = function (data) { + $this._removeResults(true); + var _options = $this._options(); + + if (data.length === 0) { + //$this._noResults(_options.noResultsText); + //return; + + // extended for insipid usage. + // allow the not found one as new ones. + var kw = $this._keyword(); + data = [{ + label: kw, + value: kw, + label_highlight: ''+kw+'' + }]; + } + + var $ul = $this._getResultsContainer(); + if (!_options.groupBy) { + console.log(data); + $this._items(data, $ul); + } else { + data = $this._groupData(data); + Object.keys(data).forEach(function (groupName, index) { + var items = data[groupName], + property = _options.groupBy, + groupText = $this._getHighlight(items[0], property, groupName); + + var $li = $('
  • ') + .addClass('group') + .append($('') + .addClass('group-name') + .html(groupText) + ) + .append($('') + .addClass('group-item-count') + .text(' ' + items.length) + ) + .appendTo($ul); + + $this._items(items, $ul); + }); + } + + var $li = $ul.find('li:not(.group)'); + $li.on('click', function (event) { + var item = $(this).data('item'); + if (item) { + $this._selected(true)._removeResults()._value(item); + $this.trigger('select:flexdatalist', [item, _options]); + } + }).hover(function () { + $li.removeClass('active'); + $(this).addClass('active'); + }, function () { + $(this).removeClass('active'); + }); + + if (_options.focusFirstResult) { + $li.filter(':first').addClass('active'); + } + } + + /** + * No results found text. + */ + $this._noResults = function (text) { + if (_this._isEmpty(text)) { + return; + } + var $container = $this._getResultsContainer(), + keyword = $this._keyword(); + + text = text.split('{keyword}').join(keyword); + $('
  • ') + .addClass('item no-results') + .append(text) + .appendTo($container) + } + + /** + * Group data by property name. + */ + $this._groupData = function (items) { + var data = [], + groupProperty = $this._options('groupBy'); + for (var index = 0; index < items.length; index++) { + var _data = items[index]; + if (_this._isDefined(_data, groupProperty)) { + var propertyValue = _data[groupProperty]; + if (!_this._isDefined(data, propertyValue)) { + data[propertyValue] = []; + } + data[propertyValue].push(_data); + } + } + return data; + } + + /** + * Items iteration. + */ + $this._items = function (items, $resultsContainer) { + var max = $this._options('maxShownResults'); + $this.trigger('show:flexdatalist.results', [items]); + for (var index = 0; index < items.length; index++) { + if (max > 0 && max === index) { + break; + } + $this._item(items[index]).appendTo($resultsContainer); + } + $this.trigger('shown:flexdatalist.results', [items]); + } + + /** + * Result item creation. + */ + $this._item = function (item) { + var $li = $('
  • ') + .data('item', item) + .addClass('item'), + _options = $this._options(), + visibleProperties = _options.visibleProperties; + + for (var index = 0; index < visibleProperties.length; index++) { + var visibleProperty = visibleProperties[index]; + if (_options.groupBy && _options.groupBy === visibleProperty || !_this._isDefined(item, visibleProperty)) { + continue; + } + var $item = {}; + if (visibleProperty === 'thumb') { + // Thumbnail image + $item = $('') + .addClass('item item-' + visibleProperty) + .attr('src', item[visibleProperty]); + } else { + var propertyText = $this._getHighlight(item, visibleProperty); + // Other text properties + $item = $('') + .addClass('item item-' + visibleProperty) + .html(propertyText + ' '); + } + $item.appendTo($li); + } + return $li; + } + + /** + * Check if highlighted property value exists, + * if true, return it, if not, fallback to given string + */ + $this._getHighlight = function (item, property, fallback) { + if (_this._isDefined(item, property + '_highlight')) { + return item[property + '_highlight']; + } + return (_this._isDefined(item, property) ? item[property] : fallback); + } + + /** + * Get/create list container. + */ + $this._getResultsContainer = function () { + var $target = $this; + if ($this._options('multiple')) { + $target = $ulMultiple; + } + var $container = $('ul.flexdatalist-results'); + if ($container.length === 0) { + $container = $('
      ') + .addClass('flexdatalist-results') + .appendTo('body') + .css({ + 'border-color': $target.css("border-left-color"), + 'border-width': '1px', + 'border-bottom-left-radius': $target.css("border-bottom-left-radius"), + 'border-bottom-right-radius': $target.css("border-bottom-right-radius") + }).data('target', $_this); + $this._position(); + } + return $container; + } + + /** + * Remove results. + */ + $this._removeResults = function (itemsOnly) { + var selector = 'ul.flexdatalist-results'; + if (itemsOnly) { + selector = 'ul.flexdatalist-results li'; + } + $(selector).remove(); + return $this; + } + + /** + * Check if is selected or set field as selected. + */ + $this._selected = function (selected) { + var className = 'flexdatalist-selected'; + if (!_this._isDefined(selected)) { + return $this.hasClass(className); + } + selected ? $this.addClass(className) : $this.removeClass(className); + return $this; + } + + /** + * Set multiple values. + */ + $this._values = function (values) { + if ($.isArray(values) && !_this._isEmpty(values)) { + $.each(values, function (i, value) { + $this._value(value); + }); + return; + } + $this._value(values); + } + + /** + * Set value on item selection. + */ + $this._value = function (val) { + var _options = $this._options(), + text = $this._getText(val), + value = $this._getValue(val); + + if (text.length > 0) { + _options._values.push(text); + } + + if (_options.multiple) { + if (val === '') { + return $this; + } + $_this.val(''); + var $li = $('
    • ') + .addClass('value' + (_options.toggleSelected ? ' toggle' : '')) + .append('' + text + '') + .append('×') + .insertBefore($ulMultiple.find('li.input-container')); + + $li.find('span.fdl-remove').click(function () { + var $container = $(this).parent(), + index = $container.index(); + if (!$container.hasClass('disabled') && ($this._toJSON() || $this._toCSV())) { + var currentValue = $this._inputValue(); + currentValue.splice(index, 1); + _options._values.splice(index, 1); + $this._inputValue(currentValue); + } + $container.remove(); + }); + // Toggle selected option + if (_options.toggleSelected) { + $li.click(function () { + var $clicked = $(this), + currentValue = $this._inputValue(), + index = $clicked.index(); + if ($clicked.hasClass('disabled')) { + var value = $clicked.data('_value'); + currentValue.splice(index, 0, value); + _options._values.splice(index, 0, $this._getText(value)); + $clicked.removeClass('disabled'); + } else { + var value = currentValue.splice(index, 1); + $clicked.data('_value', value[0]); + _options._values.splice(index, 1); + $clicked.addClass('disabled'); + } + $this._inputValue(currentValue, text); + }); + } + } else if (text && text !== $_this.val()) { + $_this.val(text); + } + $this._inputValue(value, text); + _previousText = $this._keyword(); + return $this; + } + + /** + * Get/Set input value. + */ + $this._inputValue = function (value, text) { + var isJSON = $this._toJSON(), + isCSV = $this._toCSV(); + + if (!_this._isDefined(value)) { + value = $this.val(); + if (value) { + if (isJSON) { + value = JSON.parse(value); + } else if (isCSV) { + value = value.split(','); + } + } else if (isJSON || isCSV) { + value = []; + } + return value; + } + + if (_this._isObject(value)) { + if (isJSON && !_this._isEmpty(value)) { + value = JSON.stringify(value); + } else if (isCSV) { + value = value.join(','); + } + } + if (value === '') { + $this._options('_values', []); + } + $this.val(value, true); + $this.trigger('change:flexdatalist', [value, text, $this._options()]).trigger('change'); + return value; + } + + /** + * Get text that will be shown to user on input field. + */ + $this._getText = function (item) { + var text = item, + _options = $this._options(); + + if (_this._isObject(item)) { + text = item[_options.searchIn[0]]; + if (_this._isDefined(item, _options.textProperty)) { + text = item[_options.textProperty]; + } else { + text = $this._replacePlaceholders(item, _options.textProperty, text); + } + } + return $('
      ').html(text).text(); + } + + /** + * Get the value that will be added to hidden input. + * This is the value that eventually will be sent on form submittion. + */ + $this._getValue = function (item) { + var value = item, + _options = $this._options(); + if (_this._isObject(item)) { + value = item[_options.searchIn[0]]; + if (_options.valueProperty === '*') { + value = item; + } else if (_this._isDefined(item, _options.valueProperty)) { + value = item[_options.valueProperty]; + } else if ($this._toJSON()) { + var value = {}, + properties = _options.valueProperty, + textProperty = _options.textProperty; + + // Add placeholder properties to list + if (textProperty) { + var _properties = textProperty; + if (typeof textProperty === 'string') { + _properties = $this._parsePlaceholders(textProperty); + } + if (_this._isObject(_properties)) { + $.each(_properties, function (string, property) { + properties.push(property); + }); + } + } else if (_this._isDefined(item, textProperty)) { + properties.push(textProperty); + } + + $.each(properties, function (i, property) { + if (_this._isDefined(item, property)) { + value[property] = item[property]; + } + }); + } + } + if (_options.multiple && ($this._toJSON() || $this._toCSV())) { + var currentValue = $this._inputValue(); + if (!_this._isEmpty(value) && _this._isObject(currentValue)) { + currentValue.push(value); + value = currentValue; + } + } + return value; + } + + /** + * Replace placeholders ('{property_name}') in text + * with respective property value. + */ + $this._replacePlaceholders = function (item, pattern, value) { + if (_this._isObject(item) && typeof pattern === 'string') { + var properties = $this._parsePlaceholders(pattern); + if (!_this._isEmpty(item) && properties) { + $.each(properties, function (string, property) { + if (_this._isDefined(item, property)) { + pattern = pattern.replace(string, item[property]); + } + }); + return pattern; + } + } + return value; + } + + /** + * Extract placeholders property names. + */ + $this._parsePlaceholders = function (pattern) { + var matches = pattern.match(/\{.+?\}/g); + if (matches) { + var properties = {}; + matches.map(function (string) { + properties[string] = string.slice(1, -1); + }); + return properties; + } + return false; + } + + /** + * Normalize string to a consistent one to perform the search/match. + */ + $this._normalizeString = function (string) { + if (typeof string === 'string') { + var normalizeString = $this._options('normalizeString'); + if (typeof normalizeString === 'function') { + string = normalizeString(string); + } + return string.toUpperCase(); + } + return string; + } + + /** + * Get keyword with left trim. + */ + $this._keyword = function () { + return $_this.val().replace(/^\s+/, ""); + } + + /** + * Check if input value must be a JSON string. + */ + $this._toJSON = function () { + var valueProperty = $this._options('valueProperty'); + return _this._isObject(valueProperty) || valueProperty === '*'; + } + + /** + * Check if input value must be a CSV string. + */ + $this._toCSV = function () { + return (!$this._toJSON() && $this._options('multiple')); + } + + /** + * Position results below parent element. + */ + $this._position = function () { + var $target = $_this; + if ($this._options('multiple')) { + $target = $ulMultiple; + } + // Set some required CSS properties + $('ul.flexdatalist-results').css({ + 'width': $target.outerWidth() + 'px', + 'top': (($target.offset().top + $target.outerHeight())) + 'px', + 'left': $target.offset().left + 'px', + 'z-index': ($target.css('z-index') + 1) + }); + } + // Set datalist data + $this._datalist(); + // Process default value + $this._initValue(); + // Handle chained fields + $this._chained(); + // Initialize + $this._init(); + }; + +/** + * Destroy. + */ + this._destroy = function ($_input) { + if (!$_input) { + $_input = $input; + } + $_input.each(function () { + var data = $(this).data('flexdatalist'); + $(this).removeClass('flexdatalist-set') + .attr('type', 'text') + .val((data && data.originalValue ? data.originalValue : '')) + .data('flexdatalist', null) + .next('.flexdatalist-alias, ul.flexdatalist-multiple') + .remove(); + }); + } + +/** + * Reset. + */ + this._reset = function () { + this._destroy(); + } + +/** + * Get key code from event. + */ + this._keyNum = function (event) { + return event.which || event.keyCode; + } + + // Handle selection list keyboard shortcuts and events. + if (!$document.data('flexdatalist')) { + // Remove results on outside click + $(document).mouseup(function (event) { + var $container = $('.flexdatalist-results'), + $target = $container.data('target'); + if ((!$target || !$target.is(':focus')) && !$container.is(event.target) && $container.has(event.target).length === 0) { + $container.remove(); + } + // Keyboard navigation + }).keydown(function (event) { + var $ul = $('.flexdatalist-results'), + $li = $ul.find('li'), + $active = $li.filter('.active'), + index = $active.index(), + length = $li.length, + keynum = _this._keyNum(event); + + if (length === 0) { + return; + } + + // Enter key + if (keynum === 13) { + event.preventDefault(); + $active.click(); + // Up/Down key + } else if (keynum === 40 || keynum === 38) { + event.preventDefault(); + // Down key + if (keynum === 40) { + if (index < length && $active.nextAll('.item').first().length > 0) { + $active = $active.removeClass('active').nextAll('.item').first().addClass('active'); + } else { + $active = $li.removeClass('active').filter('.item:first').addClass('active'); + } + // Up key + } else if (keynum === 38) { + if (index > 0 && $active.prevAll('.item').first().length > 0) { + $active = $active.removeClass('active').prevAll('.item').first().addClass('active'); + } else { + $active = $li.removeClass('active').filter('.item:last').addClass('active'); + } + } + + // Scroll to + var position = ($active.prev().length === 0 ? $active : $active.prev()).position().top; + $ul.animate({ + scrollTop: position + $ul.scrollTop() + }, 100); + } + }).data('flexdatalist', true); + } + +/** + * Is variable empty. + */ + this._isEmpty = function (value) { + if (!_this._isDefined(value)) { + return true; + } else if (value === null) { + return true; + } else if (value === true) { + return false; + } else if (this._length(value) === 0) { + return true; + } else if ($.trim(value) === '') { + return true; + } + return false; + } + +/** + * Is variable an object. + */ + this._isObject = function (value) { + return (value && typeof value === 'object'); + } + +/** + * To array. + */ + this._csvToArray = function (value, _default) { + if (value.length === 0) { + return _default; + } + return typeof value === 'string' ? value.split(',') : value; + } + +/** + * Get length of variable. + */ + this._length = function (value) { + if (this._isObject(value)) { + return Object.keys(value).length; + } else if (typeof value.length === 'number') { + return value.length; + } + return 0; + } +/** + * Check if variable (and optionally property) is defined. + */ + this._isDefined = function (variable, property) { + var _variable = (typeof variable !== 'undefined'); + if (_variable && typeof property !== 'undefined') { + return (typeof variable[property] !== 'undefined'); + } + return _variable; + } + +/** + * Handle options. + */ + if (typeof options === 'string') { + if (typeof this['_' + options] === 'function') { + if (!this['_' + options]()) { + return this; + } + } else if (!value) { + var _data = $input.data('flexdatalist'); + return _data[options]; + // set value programmatically + } else if (options === 'value') { + var _data = $input.data('flexdatalist'); + _data['originalValue'] = value; + _this._destroy(); + $input.data('flexdatalist', _data); + } else { + var _data = $input.data('flexdatalist'); + _data[options] = value; + $input.data('flexdatalist', _data); + return this; + } + } + + return this.each(input); +} + +var _defaultValFunc = jQuery.fn.val; +jQuery.fn.val = function (value, _flexdatalist) { + if (!_flexdatalist && $(this).hasClass('flexdatalist-set') && typeof value !== 'undefined') { + $(this).flexdatalist('value', value); + } + return _defaultValFunc.apply(this, arguments); +}; + +$(function () { + $('input.flexdatalist:not(.flexdatalist-set)').flexdatalist(); +}); \ No newline at end of file diff --git a/webroot/asset/flexdatalist/jquery.flexdatalist.min.css b/webroot/asset/flexdatalist/jquery.flexdatalist.min.css new file mode 100644 index 0000000..1d58ce6 --- /dev/null +++ b/webroot/asset/flexdatalist/jquery.flexdatalist.min.css @@ -0,0 +1 @@ +.flexdatalist-results{position:absolute;top:0;left:0;border:1px solid #444;border-top:none;background:#fff;z-index:100000;max-height:300px;overflow-y:auto;box-shadow:0 4px 5px rgba(0,0,0,.15);color:#333;list-style:none;margin:0;padding:0}.flexdatalist-results li{border-bottom:1px solid #ccc;padding:0 15px;font-size:14px;line-height:35px}.flexdatalist-results li span.highlight{font-weight:700;text-decoration:underline}.flexdatalist-results li.active{background:#2B82C9;color:#fff;cursor:pointer}.flexdatalist-results li.no-results{font-style:italic;color:#888}.flexdatalist-results li.group{background:#F3F3F4;color:#666;padding:0 8px}.flexdatalist-results li .group-name{font-weight:700}.flexdatalist-results li .group-item-count{font-size:85%;color:#777;display:inline-block;padding-left:10px}.flexdatalist-multiple:after,.flexdatalist-multiple:before{content:'';display:block;clear:both}.flexdatalist-multiple{width:100%;margin:0;padding:0 0 0 10px;list-style:none;text-align:left;cursor:text}.flexdatalist-multiple li{display:inline-block;position:relative;margin:5px 5px 5px 0;float:left}.flexdatalist-multiple li.input-container,.flexdatalist-multiple li.input-container input{border:none;width:280px;height:auto;padding:0;line-height:25px}.flexdatalist-multiple li.value{display:inline-block;padding:2px 25px 2px 5px;background:#efefef;border-radius:3px}.flexdatalist-multiple li.toggle{cursor:pointer;transition:opacity ease-in-out .3s}.flexdatalist-multiple li.toggle.disabled{text-decoration:line-through;opacity:.8}.flexdatalist-multiple li.value span.fdl-remove{font-weight:700;padding:0 5px;font-size:20px;line-height:25px;cursor:pointer;position:absolute;top:0;right:0;opacity:.7}.flexdatalist-multiple li.value span.fdl-remove:hover{opacity:1} \ No newline at end of file diff --git a/webroot/asset/flexdatalist/jquery.flexdatalist.min.js b/webroot/asset/flexdatalist/jquery.flexdatalist.min.js new file mode 100644 index 0000000..7e42777 --- /dev/null +++ b/webroot/asset/flexdatalist/jquery.flexdatalist.min.js @@ -0,0 +1 @@ +jQuery.fn.flexdatalist=function(e,t){"use strict";var a,i=$(document),s=$(this),r=this;if(a=function(){var t=$(this),a={},i="",s=null;t.attr("name");t.hasClass("flexdatalist-set")&&r._destroy(t),t._options=function(e,a){var i=t.data("flexdatalist");if(!r._isDefined(e))return t.data("flexdatalist");if(r._isDefined(a))i[e]=a;else{if(!r._isObject(e))return r._isDefined(i,e)?i[e]:null;i=e}return i.searchIn=r._csvToArray(i.searchIn),i.relatives=i.relatives&&$(i.relatives).length>0?$(i.relatives):null,i.textProperty=null===i.textProperty?i.searchIn[0]:i.textProperty,i.visibleProperties=r._csvToArray(i.visibleProperties,i.searchIn),t.data("flexdatalist",i),t},t._options($.extend({url:null,data:[],params:{},relatives:null,chainedRelatives:!1,cache:!0,minLength:2,groupBy:!1,selectionRequired:!1,focusFirstResult:!1,textProperty:null,valueProperty:null,visibleProperties:[],searchIn:["label"],searchContain:!1,searchEqual:!1,searchDisabled:!1,normalizeString:null,multiple:t.attr("multiple"),maxShownResults:100,noResultsText:'No results found for "{keyword}"',toggleSelected:!1,_values:[]},e,t.data()));var l=t.clone(!1).attr({list:null,name:null,id:t.attr("id")?t.attr("id")+"-flexdatalist":null}).addClass("flexdatalist-alias").removeClass("flexdatalist");if(t._options("multiple")){var n=$("
        ").addClass("flexdatalist-multiple").css({"background-color":t.css("background-color"),"border-color":t.css("border-left-color"),"border-width":t.css("border-left-width"),"border-style":t.css("border-left-style"),"border-radius":t.css("border-top-left-radius")}).insertAfter(t).click(function(){$(this).find("input").focus()});$('
      • ').addClass("flexdatalist-multiple-value").append(l).appendTo(n)}else l.insertAfter(t);t.addClass("flexdatalist").attr("type","hidden"),t._init=function(){var e=t._options();l.on("input keydown",function(a){var i=t._keyword();188===r._keyNum(a)&&!e.selectionRequired&&e.multiple?(a.preventDefault(),t._value(i),t._removeResults()):9===r._keyNum(a)?t._removeResults():0===i.length&&e.multiple&&8===r._keyNum(a)&&l.data("_remove",l.parents("li:eq(0)").prev())}).on("input keyup",function(a){if(t._changed()&&13!==r._keyNum(a)){var s=t._keyword();s.length>=e.minLength?t._search(function(e){t._showResults(e)}):t._removeResults(),e.multiple||(e.selectionRequired?t._value(""):t._value(s))}var n=l.data("_remove");n&&(n.find(".fdl-remove").click(),l.data("_remove",null)),i=t._keyword()}).focus(function(){var a=t._keyword();0===e.minLength?""===a&&t._tdata(function(e){t._showResults(e)}):a.length>=e.minLength&&!t._selected()&&t._search(function(e){t._showResults(e)})}).attr("autocomplete","off"),l.attr("autofocus")&&l.focus(),window.onresize=function(e){t._position()},t.addClass("flexdatalist-set")},t._changed=function(){return i!==t._keyword()},t._chained=function(){var e=t._options();if(e.relatives&&e.chainedRelatives){var i=function(a){e.relatives.each(function(){var i=r._isEmpty($(this).val()),s=r._isEmpty(t.val());l.prop("disabled",i),a||!i&&s||(t._value(""),l.val(""),e.multiple&&n.find("li .remove").click())})};e.relatives.on("change",function(){i(),a={}}),i(!0)}},t._initValue=function(){var e=t.attr("value");r._isEmpty(e)||(t._options("originalValue",t.val()),t._parseValue(e,function(e){t.val("",!0),l.val(""),r._isEmpty(e)||t._values(e),i=t._keyword()}))},t._parseValue=function(e,a){var i=t._options();if(t._toJSON())try{a(JSON.parse(e))}catch(s){}else if(t._toCSV()||"string"==typeof i.valueProperty){var r=e.split(",");if("string"==typeof i.valueProperty){var l=i.searchIn;i.searchIn=i.valueProperty.split(","),i.searchEqual=!0,t._search(function(e){e.length>0&&a(e),i.searchIn=l,i.searchEqual=!1},r)}else a(r)}else a(e)},t._tdata=function(e){t.trigger("before:flexdatalist.data"),t._url(function(a){t._data(function(i){i=i.concat(a);for(var s=t._options("_values"),r=0;r-1&&delete i[r]}t.trigger("after:flexdatalist.data",[i]),e(i)})})},t._data=function(e){var a=t._options();"string"==typeof a.data?t._remote({url:a.data,success:function(i){var s=t._getRemoteData(i);a.data=s,e(s)}}):e(a.data)},t._url=function(e){var a=t._options(),i=t._keyword(),l=t.val(),n=i;return r._isEmpty(a.url)?e([]):(clearTimeout(s),void(s=setTimeout(function(){a.cache&&2!==a.cache&&(n=i.substring(0,a.minLength>0?a.minLength:1));var s=t._cache(n);return s?void e(s):void t._remote({url:a.url,data:$.extend(t._relativesData(),a.params,{keyword:i,contain:a.searchContain,selected:l}),success:function(a){var s=t._getRemoteData(a),r=t._keyword();r.length>i.length?t._search(function(e){t._showResults(e)}):e(s),t._cache(n,s)}})},200)))},t._remote=function(e){t.hasClass("flexdatalist-loading")||(t.addClass("flexdatalist-loading"),e=$.extend({type:"post",dataType:"json",complete:function(){t.removeClass("flexdatalist-loading")}},e),$.ajax(e))},t._getRemoteData=function(e){var t=e.results?e.results:e;return"string"==typeof t&&0===t.indexOf("[{")&&(t=JSON.parse(t)),r._isObject(t)?t:[]},t._relativesData=function(){var e=t._options("relatives"),a={};return e&&(a.relatives={},e.each(function(){var e=$(this);a.relatives[e.attr("name")]=e.val()})),a},t._datalist=function(){var e=t._options(),a=t.attr("list");return r._isEmpty(a)||(e.data=[],$("#"+a).find("option").each(function(){var t=$(this).val();e.data.push({label:t,value:t})})),t},t._cache=function(e,i){if(t._options("cache")){if(e=t._normalizeString(e),!r._isDefined(i))return r._isDefined(a,e)&&(i=a[e]),i;a[e]=i}return null},t._search=function(e,a){t._tdata(function(i){var s=[],l=t._options();if(l.searchDisabled)return e(i);r._isDefined(a)||(a=t._keyword()),"string"==typeof a&&(a=[a]),t.trigger("before:flexdatalist.search",[a,i]);for(var n=0;n$&')},t._find=function(e,a){var i=t._options();return a=t._normalizeString(a),e=t._normalizeString(e),i.searchEqual?a==e:i.searchContain?a.indexOf(e)>=0:0===a.indexOf(e)},t._showResults=function(e){t._removeResults(!0);var a=t._options();if(0===e.length){var i=t._keyword();e=[{label:i,value:i,label_highlight:''+i+""}]}var s=t._getResultsContainer();a.groupBy?(e=t._groupData(e),Object.keys(e).forEach(function(i,r){var l=e[i],n=a.groupBy,o=t._getHighlight(l[0],n,i);$("
      • ").addClass("group").append($("").addClass("group-name").html(o)).append($("").addClass("group-item-count").text(" "+l.length)).appendTo(s);t._items(l,s)})):(console.log(e),t._items(e,s));var r=s.find("li:not(.group)");r.on("click",function(e){var i=$(this).data("item");i&&(t._selected(!0)._removeResults()._value(i),t.trigger("select:flexdatalist",[i,a]))}).hover(function(){r.removeClass("active"),$(this).addClass("active")},function(){$(this).removeClass("active")}),a.focusFirstResult&&r.filter(":first").addClass("active")},t._noResults=function(e){if(!r._isEmpty(e)){var a=t._getResultsContainer(),i=t._keyword();e=e.split("{keyword}").join(i),$("
      • ").addClass("item no-results").append(e).appendTo(a)}},t._groupData=function(e){for(var a=[],i=t._options("groupBy"),s=0;s0&&i===s);s++)t._item(e[s]).appendTo(a);t.trigger("shown:flexdatalist.results",[e])},t._item=function(e){for(var a=$("
      • ").data("item",e).addClass("item"),i=t._options(),s=i.visibleProperties,l=0;l").addClass("item item-"+n).attr("src",e[n]);else{var u=t._getHighlight(e,n);o=$("").addClass("item item-"+n).html(u+" ")}o.appendTo(a)}}return a},t._getHighlight=function(e,t,a){return r._isDefined(e,t+"_highlight")?e[t+"_highlight"]:r._isDefined(e,t)?e[t]:a},t._getResultsContainer=function(){var e=t;t._options("multiple")&&(e=n);var a=$("ul.flexdatalist-results");return 0===a.length&&(a=$("
          ").addClass("flexdatalist-results").appendTo("body").css({"border-color":e.css("border-left-color"),"border-width":"1px","border-bottom-left-radius":e.css("border-bottom-left-radius"),"border-bottom-right-radius":e.css("border-bottom-right-radius")}).data("target",l),t._position()),a},t._removeResults=function(e){var a="ul.flexdatalist-results";return e&&(a="ul.flexdatalist-results li"),$(a).remove(),t},t._selected=function(e){var a="flexdatalist-selected";return r._isDefined(e)?(e?t.addClass(a):t.removeClass(a),t):t.hasClass(a)},t._values=function(e){return $.isArray(e)&&!r._isEmpty(e)?void $.each(e,function(e,a){t._value(a)}):void t._value(e)},t._value=function(e){var a=t._options(),s=t._getText(e),r=t._getValue(e);if(s.length>0&&a._values.push(s),a.multiple){if(""===e)return t;l.val("");var o=$("
        • ").addClass("value"+(a.toggleSelected?" toggle":"")).append(''+s+"").append('×').insertBefore(n.find("li.input-container"));o.find("span.fdl-remove").click(function(){var e=$(this).parent(),i=e.index();if(!e.hasClass("disabled")&&(t._toJSON()||t._toCSV())){var s=t._inputValue();s.splice(i,1),a._values.splice(i,1),t._inputValue(s)}e.remove()}),a.toggleSelected&&o.click(function(){var e=$(this),i=t._inputValue(),r=e.index();if(e.hasClass("disabled")){var l=e.data("_value");i.splice(r,0,l),a._values.splice(r,0,t._getText(l)),e.removeClass("disabled")}else{var l=i.splice(r,1);e.data("_value",l[0]),a._values.splice(r,1),e.addClass("disabled")}t._inputValue(i,s)})}else s&&s!==l.val()&&l.val(s);return t._inputValue(r,s),i=t._keyword(),t},t._inputValue=function(e,a){var i=t._toJSON(),s=t._toCSV();return r._isDefined(e)?(r._isObject(e)&&(i&&!r._isEmpty(e)?e=JSON.stringify(e):s&&(e=e.join(","))),""===e&&t._options("_values",[]),t.val(e,!0),t.trigger("change:flexdatalist",[e,a,t._options()]).trigger("change"),e):(e=t.val(),e?i?e=JSON.parse(e):s&&(e=e.split(",")):(i||s)&&(e=[]),e)},t._getText=function(e){var a=e,i=t._options();return r._isObject(e)&&(a=e[i.searchIn[0]],a=r._isDefined(e,i.textProperty)?e[i.textProperty]:t._replacePlaceholders(e,i.textProperty,a)),$("
          ").html(a).text()},t._getValue=function(e){var a=e,i=t._options();if(r._isObject(e))if(a=e[i.searchIn[0]],"*"===i.valueProperty)a=e;else if(r._isDefined(e,i.valueProperty))a=e[i.valueProperty];else if(t._toJSON()){var a={},s=i.valueProperty,l=i.textProperty;if(l){var n=l;"string"==typeof l&&(n=t._parsePlaceholders(l)),r._isObject(n)&&$.each(n,function(e,t){s.push(t)})}else r._isDefined(e,l)&&s.push(l);$.each(s,function(t,i){r._isDefined(e,i)&&(a[i]=e[i])})}if(i.multiple&&(t._toJSON()||t._toCSV())){var o=t._inputValue();!r._isEmpty(a)&&r._isObject(o)&&(o.push(a),a=o)}return a},t._replacePlaceholders=function(e,a,i){if(r._isObject(e)&&"string"==typeof a){var s=t._parsePlaceholders(a);if(!r._isEmpty(e)&&s)return $.each(s,function(t,i){r._isDefined(e,i)&&(a=a.replace(t,e[i]))}),a}return i},t._parsePlaceholders=function(e){var t=e.match(/\{.+?\}/g);if(t){var a={};return t.map(function(e){a[e]=e.slice(1,-1)}),a}return!1},t._normalizeString=function(e){if("string"==typeof e){var a=t._options("normalizeString");return"function"==typeof a&&(e=a(e)),e.toUpperCase()}return e},t._keyword=function(){return l.val().replace(/^\s+/,"")},t._toJSON=function(){var e=t._options("valueProperty");return r._isObject(e)||"*"===e},t._toCSV=function(){return!t._toJSON()&&t._options("multiple")},t._position=function(){var e=l;t._options("multiple")&&(e=n),$("ul.flexdatalist-results").css({width:e.outerWidth()+"px",top:e.offset().top+e.outerHeight()+"px",left:e.offset().left+"px","z-index":e.css("z-index")+1})},t._datalist(),t._initValue(),t._chained(),t._init()},this._destroy=function(e){e||(e=s),e.each(function(){var e=$(this).data("flexdatalist");$(this).removeClass("flexdatalist-set").attr("type","text").val(e&&e.originalValue?e.originalValue:"").data("flexdatalist",null).next(".flexdatalist-alias, ul.flexdatalist-multiple").remove()})},this._reset=function(){this._destroy()},this._keyNum=function(e){return e.which||e.keyCode},i.data("flexdatalist")||$(document).mouseup(function(e){var t=$(".flexdatalist-results"),a=t.data("target");a&&a.is(":focus")||t.is(e.target)||0!==t.has(e.target).length||t.remove()}).keydown(function(e){var t=$(".flexdatalist-results"),a=t.find("li"),i=a.filter(".active"),s=i.index(),l=a.length,n=r._keyNum(e);if(0!==l)if(13===n)e.preventDefault(),i.click();else if(40===n||38===n){e.preventDefault(),40===n?i=l>s&&i.nextAll(".item").first().length>0?i.removeClass("active").nextAll(".item").first().addClass("active"):a.removeClass("active").filter(".item:first").addClass("active"):38===n&&(i=s>0&&i.prevAll(".item").first().length>0?i.removeClass("active").prevAll(".item").first().addClass("active"):a.removeClass("active").filter(".item:last").addClass("active"));var o=(0===i.prev().length?i:i.prev()).position().top;t.animate({scrollTop:o+t.scrollTop()},100)}}).data("flexdatalist",!0),this._isEmpty=function(e){return r._isDefined(e)?null===e?!0:e===!0?!1:0===this._length(e)?!0:""===$.trim(e)?!0:!1:!0},this._isObject=function(e){return e&&"object"==typeof e},this._csvToArray=function(e,t){return 0===e.length?t:"string"==typeof e?e.split(","):e},this._length=function(e){return this._isObject(e)?Object.keys(e).length:"number"==typeof e.length?e.length:0},this._isDefined=function(e,t){var a="undefined"!=typeof e;return a&&"undefined"!=typeof t?"undefined"!=typeof e[t]:a},"string"==typeof e)if("function"==typeof this["_"+e]){if(!this["_"+e]())return this}else{if(!t){var l=s.data("flexdatalist");return l[e]}if("value"!==e){var l=s.data("flexdatalist");return l[e]=t,s.data("flexdatalist",l),this}var l=s.data("flexdatalist");l.originalValue=t,r._destroy(),s.data("flexdatalist",l)}return this.each(a)};var _defaultValFunc=jQuery.fn.val;jQuery.fn.val=function(e,t){return!t&&$(this).hasClass("flexdatalist-set")&&"undefined"!=typeof e&&$(this).flexdatalist("value",e),_defaultValFunc.apply(this,arguments)},$(function(){$("input.flexdatalist:not(.flexdatalist-set)").flexdatalist()}); \ No newline at end of file diff --git a/webroot/asset/img/insipid.png b/webroot/asset/img/insipid.png new file mode 100644 index 0000000000000000000000000000000000000000..9a374a08ce111d304816da0cdb183289183e855c GIT binary patch literal 108096 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 zD>p9k^M5{mpRcVKQDB->query($queryStr); + if(!empty($query) && $query->num_rows > 0) { + $ret = $query->fetch_all(MYSQLI_ASSOC); + } + + return $ret; + } + } ?> \ No newline at end of file diff --git a/webroot/view/_foot.php b/webroot/view/_foot.php index d429468..92445bf 100644 --- a/webroot/view/_foot.php +++ b/webroot/view/_foot.php @@ -39,6 +39,7 @@ + diff --git a/webroot/view/_head.php b/webroot/view/_head.php index 3b67ef6..4a4761c 100644 --- a/webroot/view/_head.php +++ b/webroot/view/_head.php @@ -35,6 +35,7 @@ Insipid + \ No newline at end of file diff --git a/webroot/view/home.inc.php b/webroot/view/home.inc.php index 6a40d96..3bc26f7 100644 --- a/webroot/view/home.inc.php +++ b/webroot/view/home.inc.php @@ -70,9 +70,15 @@ if(isset($_POST['data']) && !empty($_POST['data']) && isset($_POST['submitsearch # try to gather some information automatically $linkInfo = Summoner::gatherInfoFromURL($searchValue); if(!empty($linkInfo)) { - $formData['description'] = $linkInfo['description']; - $formData['title'] = $linkInfo['title']; - $formData['image'] = $linkInfo['image']; + if(isset($linkInfo['description'])) { + $formData['description'] = $linkInfo['description']; + } + if(isset($linkInfo['title'])) { + $formData['title'] = $linkInfo['title']; + } + if(isset($linkInfo['image'])) { + $formData['image'] = $linkInfo['image']; + } } # show the add form $showAddForm = true; @@ -120,8 +126,6 @@ if(isset($_POST['data']) && !empty($_POST['data']) && isset($_POST['addnewone']) $DB->query($queryStr); $linkID = $DB->insert_id; - var_dump($linkID); - if(!empty($linkID)) { # categories and tag stuff @@ -165,4 +169,5 @@ if(isset($_POST['data']) && !empty($_POST['data']) && isset($_POST['addnewone']) } $existingCategories = $Management->categories(); -$existingTags = $Management->tags(); \ No newline at end of file +$existingTags = $Management->tags(); +$latestLinks = $Management->latest(); \ No newline at end of file diff --git a/webroot/view/home.php b/webroot/view/home.php index 751f145..38ce572 100644 --- a/webroot/view/home.php +++ b/webroot/view/home.php @@ -66,6 +66,22 @@
          + + + +
          @@ -112,10 +128,12 @@
          @@ -123,10 +141,12 @@
          @@ -165,10 +185,18 @@

          Last added

          - +
          -

          It has an easy to override visual style, and is appropriately subdued.

          - I'm a button + +
            + +
          • + +
          • + +
          + more +
          -- 2.39.5