completato (spero) controllo autocompletamento testo e chiavi...
aggiunto jQuery updated git-svn-id: https://keyhammer.ath.cx/svn/ETS/trunk@33 72332f79-082b-4ce8-9953-5b7f197a49bb
This commit is contained in:
Binary file not shown.
@@ -262,11 +262,15 @@
|
||||
<Content Include="css\Style.css">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Scripts\jquery-1.4.4-vsdoc.js" />
|
||||
<Content Include="Scripts\jquery-1.4.4.js" />
|
||||
<Content Include="Scripts\jquery-1.4.4.min.js" />
|
||||
<Content Include="Scripts\jquery-1.6.4-vsdoc.js" />
|
||||
<Content Include="Scripts\jquery-1.6.4.js" />
|
||||
<Content Include="Scripts\jquery-1.6.4.min.js" />
|
||||
<Content Include="Scripts\jquery-ui-1.8.23.js" />
|
||||
<Content Include="Scripts\jquery-ui-1.8.23.min.js" />
|
||||
<Content Include="Scripts\jquery-ui-1.8.23.min.js">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Scripts\jquery.tokeninput.js" />
|
||||
<Content Include="Scripts\jquery.tokeninput.min.js" />
|
||||
<Content Include="test.aspx" />
|
||||
<Content Include="testMast.aspx" />
|
||||
<Content Include="Web.config">
|
||||
@@ -285,6 +289,7 @@
|
||||
<Content Include="WebUserControls\mod_myTempFile.ascx" />
|
||||
<Content Include="WebUserControls\mod_testata.ascx" />
|
||||
<Content Include="WebUserControls\mod_testataProt.ascx" />
|
||||
<Content Include="WebUserControls\mod_textAutocomplete.ascx" />
|
||||
<Content Include="WS\AutoCompletamento.asmx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@@ -429,6 +434,13 @@
|
||||
<Compile Include="WebUserControls\mod_testataProt.ascx.designer.cs">
|
||||
<DependentUpon>mod_testataProt.ascx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="WebUserControls\mod_textAutocomplete.ascx.cs">
|
||||
<DependentUpon>mod_textAutocomplete.ascx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="WebUserControls\mod_textAutocomplete.ascx.designer.cs">
|
||||
<DependentUpon>mod_textAutocomplete.ascx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="WS\AutoCompletamento.asmx.cs">
|
||||
<DependentUpon>AutoCompletamento.asmx</DependentUpon>
|
||||
<SubType>Component</SubType>
|
||||
|
||||
@@ -23,6 +23,6 @@
|
||||
<rules>
|
||||
<!-- logging rules -->
|
||||
<logger name="*" minlevel="Trace" writeTo="f" />
|
||||
<logger name="*" minlevel="Trace" writeTo="sentinel" />
|
||||
<!--<logger name="*" minlevel="Trace" writeTo="sentinel" />-->
|
||||
</rules>
|
||||
</nlog>
|
||||
+7024
File diff suppressed because it is too large
Load Diff
+9046
File diff suppressed because it is too large
Load Diff
+4
File diff suppressed because one or more lines are too long
@@ -0,0 +1,860 @@
|
||||
/*
|
||||
* jQuery Plugin: Tokenizing Autocomplete Text Entry
|
||||
* Version 1.6.0
|
||||
*
|
||||
* Copyright (c) 2009 James Smith (http://loopj.com)
|
||||
* Licensed jointly under the GPL and MIT licenses,
|
||||
* choose which one suits your project best!
|
||||
*
|
||||
*/
|
||||
|
||||
(function ($) {
|
||||
// Default settings
|
||||
var DEFAULT_SETTINGS = {
|
||||
// Search settings
|
||||
method: "GET",
|
||||
contentType: "json",
|
||||
queryParam: "q",
|
||||
searchDelay: 300,
|
||||
minChars: 1,
|
||||
propertyToSearch: "name",
|
||||
jsonContainer: null,
|
||||
|
||||
// Display settings
|
||||
hintText: "Type in a search term",
|
||||
noResultsText: "No results",
|
||||
searchingText: "Searching...",
|
||||
deleteText: "×",
|
||||
animateDropdown: true,
|
||||
|
||||
// Tokenization settings
|
||||
tokenLimit: null,
|
||||
tokenDelimiter: ",",
|
||||
preventDuplicates: false,
|
||||
|
||||
// Output settings
|
||||
tokenValue: "id",
|
||||
|
||||
// Prepopulation settings
|
||||
prePopulate: null,
|
||||
processPrePopulate: false,
|
||||
|
||||
// Manipulation settings
|
||||
idPrefix: "token-input-",
|
||||
|
||||
// Formatters
|
||||
resultsFormatter: function(item){ return "<li>" + item[this.propertyToSearch]+ "</li>" },
|
||||
tokenFormatter: function(item) { return "<li><p>" + item[this.propertyToSearch] + "</p></li>" },
|
||||
|
||||
// Callbacks
|
||||
onResult: null,
|
||||
onAdd: null,
|
||||
onDelete: null,
|
||||
onReady: null
|
||||
};
|
||||
|
||||
// Default classes to use when theming
|
||||
var DEFAULT_CLASSES = {
|
||||
tokenList: "token-input-list",
|
||||
token: "token-input-token",
|
||||
tokenDelete: "token-input-delete-token",
|
||||
selectedToken: "token-input-selected-token",
|
||||
highlightedToken: "token-input-highlighted-token",
|
||||
dropdown: "token-input-dropdown",
|
||||
dropdownItem: "token-input-dropdown-item",
|
||||
dropdownItem2: "token-input-dropdown-item2",
|
||||
selectedDropdownItem: "token-input-selected-dropdown-item",
|
||||
inputToken: "token-input-input-token"
|
||||
};
|
||||
|
||||
// Input box position "enum"
|
||||
var POSITION = {
|
||||
BEFORE: 0,
|
||||
AFTER: 1,
|
||||
END: 2
|
||||
};
|
||||
|
||||
// Keys "enum"
|
||||
var KEY = {
|
||||
BACKSPACE: 8,
|
||||
TAB: 9,
|
||||
ENTER: 13,
|
||||
ESCAPE: 27,
|
||||
SPACE: 32,
|
||||
PAGE_UP: 33,
|
||||
PAGE_DOWN: 34,
|
||||
END: 35,
|
||||
HOME: 36,
|
||||
LEFT: 37,
|
||||
UP: 38,
|
||||
RIGHT: 39,
|
||||
DOWN: 40,
|
||||
NUMPAD_ENTER: 108,
|
||||
COMMA: 188
|
||||
};
|
||||
|
||||
// Additional public (exposed) methods
|
||||
var methods = {
|
||||
init: function(url_or_data_or_function, options) {
|
||||
var settings = $.extend({}, DEFAULT_SETTINGS, options || {});
|
||||
|
||||
return this.each(function () {
|
||||
$(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings));
|
||||
});
|
||||
},
|
||||
clear: function() {
|
||||
this.data("tokenInputObject").clear();
|
||||
return this;
|
||||
},
|
||||
add: function(item) {
|
||||
this.data("tokenInputObject").add(item);
|
||||
return this;
|
||||
},
|
||||
remove: function(item) {
|
||||
this.data("tokenInputObject").remove(item);
|
||||
return this;
|
||||
},
|
||||
get: function() {
|
||||
return this.data("tokenInputObject").getTokens();
|
||||
}
|
||||
}
|
||||
|
||||
// Expose the .tokenInput function to jQuery as a plugin
|
||||
$.fn.tokenInput = function (method) {
|
||||
// Method calling and initialization logic
|
||||
if(methods[method]) {
|
||||
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
||||
} else {
|
||||
return methods.init.apply(this, arguments);
|
||||
}
|
||||
};
|
||||
|
||||
// TokenList class for each input
|
||||
$.TokenList = function (input, url_or_data, settings) {
|
||||
//
|
||||
// Initialization
|
||||
//
|
||||
|
||||
// Configure the data source
|
||||
if($.type(url_or_data) === "string" || $.type(url_or_data) === "function") {
|
||||
// Set the url to query against
|
||||
settings.url = url_or_data;
|
||||
|
||||
// If the URL is a function, evaluate it here to do our initalization work
|
||||
var url = computeURL();
|
||||
|
||||
// Make a smart guess about cross-domain if it wasn't explicitly specified
|
||||
if(settings.crossDomain === undefined) {
|
||||
if(url.indexOf("://") === -1) {
|
||||
settings.crossDomain = false;
|
||||
} else {
|
||||
settings.crossDomain = (location.href.split(/\/+/g)[1] !== url.split(/\/+/g)[1]);
|
||||
}
|
||||
}
|
||||
} else if(typeof(url_or_data) === "object") {
|
||||
// Set the local data to search through
|
||||
settings.local_data = url_or_data;
|
||||
}
|
||||
|
||||
// Build class names
|
||||
if(settings.classes) {
|
||||
// Use custom class names
|
||||
settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes);
|
||||
} else if(settings.theme) {
|
||||
// Use theme-suffixed default class names
|
||||
settings.classes = {};
|
||||
$.each(DEFAULT_CLASSES, function(key, value) {
|
||||
settings.classes[key] = value + "-" + settings.theme;
|
||||
});
|
||||
} else {
|
||||
settings.classes = DEFAULT_CLASSES;
|
||||
}
|
||||
|
||||
|
||||
// Save the tokens
|
||||
var saved_tokens = [];
|
||||
|
||||
// Keep track of the number of tokens in the list
|
||||
var token_count = 0;
|
||||
|
||||
// Basic cache to save on db hits
|
||||
var cache = new $.TokenList.Cache();
|
||||
|
||||
// Keep track of the timeout, old vals
|
||||
var timeout;
|
||||
var input_val;
|
||||
|
||||
// Create a new text input an attach keyup events
|
||||
var input_box = $("<input type=\"text\" autocomplete=\"off\">")
|
||||
.css({
|
||||
outline: "none"
|
||||
})
|
||||
.attr("id", settings.idPrefix + input.id)
|
||||
.focus(function () {
|
||||
if (settings.tokenLimit === null || settings.tokenLimit !== token_count) {
|
||||
show_dropdown_hint();
|
||||
}
|
||||
})
|
||||
.blur(function () {
|
||||
hide_dropdown();
|
||||
$(this).val("");
|
||||
})
|
||||
.bind("keyup keydown blur update", resize_input)
|
||||
.keydown(function (event) {
|
||||
var previous_token;
|
||||
var next_token;
|
||||
|
||||
switch(event.keyCode) {
|
||||
case KEY.LEFT:
|
||||
case KEY.RIGHT:
|
||||
case KEY.UP:
|
||||
case KEY.DOWN:
|
||||
if(!$(this).val()) {
|
||||
previous_token = input_token.prev();
|
||||
next_token = input_token.next();
|
||||
|
||||
if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) {
|
||||
// Check if there is a previous/next token and it is selected
|
||||
if(event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) {
|
||||
deselect_token($(selected_token), POSITION.BEFORE);
|
||||
} else {
|
||||
deselect_token($(selected_token), POSITION.AFTER);
|
||||
}
|
||||
} else if((event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) && previous_token.length) {
|
||||
// We are moving left, select the previous token if it exists
|
||||
select_token($(previous_token.get(0)));
|
||||
} else if((event.keyCode === KEY.RIGHT || event.keyCode === KEY.DOWN) && next_token.length) {
|
||||
// We are moving right, select the next token if it exists
|
||||
select_token($(next_token.get(0)));
|
||||
}
|
||||
} else {
|
||||
var dropdown_item = null;
|
||||
|
||||
if(event.keyCode === KEY.DOWN || event.keyCode === KEY.RIGHT) {
|
||||
dropdown_item = $(selected_dropdown_item).next();
|
||||
} else {
|
||||
dropdown_item = $(selected_dropdown_item).prev();
|
||||
}
|
||||
|
||||
if(dropdown_item.length) {
|
||||
select_dropdown_item(dropdown_item);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.BACKSPACE:
|
||||
previous_token = input_token.prev();
|
||||
|
||||
if(!$(this).val().length) {
|
||||
if(selected_token) {
|
||||
delete_token($(selected_token));
|
||||
hidden_input.change();
|
||||
} else if(previous_token.length) {
|
||||
select_token($(previous_token.get(0)));
|
||||
}
|
||||
|
||||
return false;
|
||||
} else if($(this).val().length === 1) {
|
||||
hide_dropdown();
|
||||
} else {
|
||||
// set a timeout just long enough to let this function finish.
|
||||
setTimeout(function(){do_search();}, 5);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.TAB:
|
||||
case KEY.ENTER:
|
||||
case KEY.NUMPAD_ENTER:
|
||||
case KEY.COMMA:
|
||||
if(selected_dropdown_item) {
|
||||
add_token($(selected_dropdown_item).data("tokeninput"));
|
||||
hidden_input.change();
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.ESCAPE:
|
||||
hide_dropdown();
|
||||
return true;
|
||||
|
||||
default:
|
||||
if(String.fromCharCode(event.which)) {
|
||||
// set a timeout just long enough to let this function finish.
|
||||
setTimeout(function(){do_search();}, 5);
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// Keep a reference to the original input box
|
||||
var hidden_input = $(input)
|
||||
.hide()
|
||||
.val("")
|
||||
.focus(function () {
|
||||
input_box.focus();
|
||||
})
|
||||
.blur(function () {
|
||||
input_box.blur();
|
||||
});
|
||||
|
||||
// Keep a reference to the selected token and dropdown item
|
||||
var selected_token = null;
|
||||
var selected_token_index = 0;
|
||||
var selected_dropdown_item = null;
|
||||
|
||||
// The list to store the token items in
|
||||
var token_list = $("<ul />")
|
||||
.addClass(settings.classes.tokenList)
|
||||
.click(function (event) {
|
||||
var li = $(event.target).closest("li");
|
||||
if(li && li.get(0) && $.data(li.get(0), "tokeninput")) {
|
||||
toggle_select_token(li);
|
||||
} else {
|
||||
// Deselect selected token
|
||||
if(selected_token) {
|
||||
deselect_token($(selected_token), POSITION.END);
|
||||
}
|
||||
|
||||
// Focus input box
|
||||
input_box.focus();
|
||||
}
|
||||
})
|
||||
.mouseover(function (event) {
|
||||
var li = $(event.target).closest("li");
|
||||
if(li && selected_token !== this) {
|
||||
li.addClass(settings.classes.highlightedToken);
|
||||
}
|
||||
})
|
||||
.mouseout(function (event) {
|
||||
var li = $(event.target).closest("li");
|
||||
if(li && selected_token !== this) {
|
||||
li.removeClass(settings.classes.highlightedToken);
|
||||
}
|
||||
})
|
||||
.insertBefore(hidden_input);
|
||||
|
||||
// The token holding the input box
|
||||
var input_token = $("<li />")
|
||||
.addClass(settings.classes.inputToken)
|
||||
.appendTo(token_list)
|
||||
.append(input_box);
|
||||
|
||||
// The list to store the dropdown items in
|
||||
var dropdown = $("<div>")
|
||||
.addClass(settings.classes.dropdown)
|
||||
.appendTo("body")
|
||||
.hide();
|
||||
|
||||
// Magic element to help us resize the text input
|
||||
var input_resizer = $("<tester/>")
|
||||
.insertAfter(input_box)
|
||||
.css({
|
||||
position: "absolute",
|
||||
top: -9999,
|
||||
left: -9999,
|
||||
width: "auto",
|
||||
fontSize: input_box.css("fontSize"),
|
||||
fontFamily: input_box.css("fontFamily"),
|
||||
fontWeight: input_box.css("fontWeight"),
|
||||
letterSpacing: input_box.css("letterSpacing"),
|
||||
whiteSpace: "nowrap"
|
||||
});
|
||||
|
||||
// Pre-populate list if items exist
|
||||
hidden_input.val("");
|
||||
var li_data = settings.prePopulate || hidden_input.data("pre");
|
||||
if(settings.processPrePopulate && $.isFunction(settings.onResult)) {
|
||||
li_data = settings.onResult.call(hidden_input, li_data);
|
||||
}
|
||||
if(li_data && li_data.length) {
|
||||
$.each(li_data, function (index, value) {
|
||||
insert_token(value);
|
||||
checkTokenLimit();
|
||||
});
|
||||
}
|
||||
|
||||
// Initialization is done
|
||||
if($.isFunction(settings.onReady)) {
|
||||
settings.onReady.call();
|
||||
}
|
||||
|
||||
//
|
||||
// Public functions
|
||||
//
|
||||
|
||||
this.clear = function() {
|
||||
token_list.children("li").each(function() {
|
||||
if ($(this).children("input").length === 0) {
|
||||
delete_token($(this));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
this.add = function(item) {
|
||||
add_token(item);
|
||||
}
|
||||
|
||||
this.remove = function(item) {
|
||||
token_list.children("li").each(function() {
|
||||
if ($(this).children("input").length === 0) {
|
||||
var currToken = $(this).data("tokeninput");
|
||||
var match = true;
|
||||
for (var prop in item) {
|
||||
if (item[prop] !== currToken[prop]) {
|
||||
match = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (match) {
|
||||
delete_token($(this));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
this.getTokens = function() {
|
||||
return saved_tokens;
|
||||
}
|
||||
|
||||
//
|
||||
// Private functions
|
||||
//
|
||||
|
||||
function checkTokenLimit() {
|
||||
if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
|
||||
input_box.hide();
|
||||
hide_dropdown();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function resize_input() {
|
||||
if(input_val === (input_val = input_box.val())) {return;}
|
||||
|
||||
// Enter new content into resizer and resize input accordingly
|
||||
var escaped = input_val.replace(/&/g, '&').replace(/\s/g,' ').replace(/</g, '<').replace(/>/g, '>');
|
||||
input_resizer.html(escaped);
|
||||
input_box.width(input_resizer.width() + 30);
|
||||
}
|
||||
|
||||
function is_printable_character(keycode) {
|
||||
return ((keycode >= 48 && keycode <= 90) || // 0-1a-z
|
||||
(keycode >= 96 && keycode <= 111) || // numpad 0-9 + - / * .
|
||||
(keycode >= 186 && keycode <= 192) || // ; = , - . / ^
|
||||
(keycode >= 219 && keycode <= 222)); // ( \ ) '
|
||||
}
|
||||
|
||||
// Inner function to a token to the list
|
||||
function insert_token(item) {
|
||||
var this_token = settings.tokenFormatter(item);
|
||||
this_token = $(this_token)
|
||||
.addClass(settings.classes.token)
|
||||
.insertBefore(input_token);
|
||||
|
||||
// The 'delete token' button
|
||||
$("<span>" + settings.deleteText + "</span>")
|
||||
.addClass(settings.classes.tokenDelete)
|
||||
.appendTo(this_token)
|
||||
.click(function () {
|
||||
delete_token($(this).parent());
|
||||
hidden_input.change();
|
||||
return false;
|
||||
});
|
||||
|
||||
// Store data on the token
|
||||
var token_data = {"id": item.id};
|
||||
token_data[settings.propertyToSearch] = item[settings.propertyToSearch];
|
||||
$.data(this_token.get(0), "tokeninput", item);
|
||||
|
||||
// Save this token for duplicate checking
|
||||
saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index));
|
||||
selected_token_index++;
|
||||
|
||||
// Update the hidden input
|
||||
update_hidden_input(saved_tokens, hidden_input);
|
||||
|
||||
token_count += 1;
|
||||
|
||||
// Check the token limit
|
||||
if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
|
||||
input_box.hide();
|
||||
hide_dropdown();
|
||||
}
|
||||
|
||||
return this_token;
|
||||
}
|
||||
|
||||
// Add a token to the token list based on user input
|
||||
function add_token (item) {
|
||||
var callback = settings.onAdd;
|
||||
|
||||
// See if the token already exists and select it if we don't want duplicates
|
||||
if(token_count > 0 && settings.preventDuplicates) {
|
||||
var found_existing_token = null;
|
||||
token_list.children().each(function () {
|
||||
var existing_token = $(this);
|
||||
var existing_data = $.data(existing_token.get(0), "tokeninput");
|
||||
if(existing_data && existing_data.id === item.id) {
|
||||
found_existing_token = existing_token;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if(found_existing_token) {
|
||||
select_token(found_existing_token);
|
||||
input_token.insertAfter(found_existing_token);
|
||||
input_box.focus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Insert the new tokens
|
||||
if(settings.tokenLimit == null || token_count < settings.tokenLimit) {
|
||||
insert_token(item);
|
||||
checkTokenLimit();
|
||||
}
|
||||
|
||||
// Clear input box
|
||||
input_box.val("");
|
||||
|
||||
// Don't show the help dropdown, they've got the idea
|
||||
hide_dropdown();
|
||||
|
||||
// Execute the onAdd callback if defined
|
||||
if($.isFunction(callback)) {
|
||||
callback.call(hidden_input,item);
|
||||
}
|
||||
}
|
||||
|
||||
// Select a token in the token list
|
||||
function select_token (token) {
|
||||
token.addClass(settings.classes.selectedToken);
|
||||
selected_token = token.get(0);
|
||||
|
||||
// Hide input box
|
||||
input_box.val("");
|
||||
|
||||
// Hide dropdown if it is visible (eg if we clicked to select token)
|
||||
hide_dropdown();
|
||||
}
|
||||
|
||||
// Deselect a token in the token list
|
||||
function deselect_token (token, position) {
|
||||
token.removeClass(settings.classes.selectedToken);
|
||||
selected_token = null;
|
||||
|
||||
if(position === POSITION.BEFORE) {
|
||||
input_token.insertBefore(token);
|
||||
selected_token_index--;
|
||||
} else if(position === POSITION.AFTER) {
|
||||
input_token.insertAfter(token);
|
||||
selected_token_index++;
|
||||
} else {
|
||||
input_token.appendTo(token_list);
|
||||
selected_token_index = token_count;
|
||||
}
|
||||
|
||||
// Show the input box and give it focus again
|
||||
input_box.focus();
|
||||
}
|
||||
|
||||
// Toggle selection of a token in the token list
|
||||
function toggle_select_token(token) {
|
||||
var previous_selected_token = selected_token;
|
||||
|
||||
if(selected_token) {
|
||||
deselect_token($(selected_token), POSITION.END);
|
||||
}
|
||||
|
||||
if(previous_selected_token === token.get(0)) {
|
||||
deselect_token(token, POSITION.END);
|
||||
} else {
|
||||
select_token(token);
|
||||
}
|
||||
}
|
||||
|
||||
// Delete a token from the token list
|
||||
function delete_token (token) {
|
||||
// Remove the id from the saved list
|
||||
var token_data = $.data(token.get(0), "tokeninput");
|
||||
var callback = settings.onDelete;
|
||||
|
||||
var index = token.prevAll().length;
|
||||
if(index > selected_token_index) index--;
|
||||
|
||||
// Delete the token
|
||||
token.remove();
|
||||
selected_token = null;
|
||||
|
||||
// Show the input box and give it focus again
|
||||
input_box.focus();
|
||||
|
||||
// Remove this token from the saved list
|
||||
saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1));
|
||||
if(index < selected_token_index) selected_token_index--;
|
||||
|
||||
// Update the hidden input
|
||||
update_hidden_input(saved_tokens, hidden_input);
|
||||
|
||||
token_count -= 1;
|
||||
|
||||
if(settings.tokenLimit !== null) {
|
||||
input_box
|
||||
.show()
|
||||
.val("")
|
||||
.focus();
|
||||
}
|
||||
|
||||
// Execute the onDelete callback if defined
|
||||
if($.isFunction(callback)) {
|
||||
callback.call(hidden_input,token_data);
|
||||
}
|
||||
}
|
||||
|
||||
// Update the hidden input box value
|
||||
function update_hidden_input(saved_tokens, hidden_input) {
|
||||
var token_values = $.map(saved_tokens, function (el) {
|
||||
return el[settings.tokenValue];
|
||||
});
|
||||
hidden_input.val(token_values.join(settings.tokenDelimiter));
|
||||
|
||||
}
|
||||
|
||||
// Hide and clear the results dropdown
|
||||
function hide_dropdown () {
|
||||
dropdown.hide().empty();
|
||||
selected_dropdown_item = null;
|
||||
}
|
||||
|
||||
function show_dropdown() {
|
||||
dropdown
|
||||
.css({
|
||||
position: "absolute",
|
||||
top: $(token_list).offset().top + $(token_list).outerHeight(),
|
||||
left: $(token_list).offset().left,
|
||||
zindex: 999
|
||||
})
|
||||
.show();
|
||||
}
|
||||
|
||||
function show_dropdown_searching () {
|
||||
if(settings.searchingText) {
|
||||
dropdown.html("<p>"+settings.searchingText+"</p>");
|
||||
show_dropdown();
|
||||
}
|
||||
}
|
||||
|
||||
function show_dropdown_hint () {
|
||||
if(settings.hintText) {
|
||||
dropdown.html("<p>"+settings.hintText+"</p>");
|
||||
show_dropdown();
|
||||
}
|
||||
}
|
||||
|
||||
// Highlight the query part of the search term
|
||||
function highlight_term(value, term) {
|
||||
return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>");
|
||||
}
|
||||
|
||||
function find_value_and_highlight_term(template, value, term) {
|
||||
return template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + value + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term));
|
||||
}
|
||||
|
||||
// Populate the results dropdown with some results
|
||||
function populate_dropdown (query, results) {
|
||||
if(results && results.length) {
|
||||
dropdown.empty();
|
||||
var dropdown_ul = $("<ul>")
|
||||
.appendTo(dropdown)
|
||||
.mouseover(function (event) {
|
||||
select_dropdown_item($(event.target).closest("li"));
|
||||
})
|
||||
.mousedown(function (event) {
|
||||
add_token($(event.target).closest("li").data("tokeninput"));
|
||||
hidden_input.change();
|
||||
return false;
|
||||
})
|
||||
.hide();
|
||||
|
||||
$.each(results, function(index, value) {
|
||||
var this_li = settings.resultsFormatter(value);
|
||||
|
||||
this_li = find_value_and_highlight_term(this_li ,value[settings.propertyToSearch], query);
|
||||
|
||||
this_li = $(this_li).appendTo(dropdown_ul);
|
||||
|
||||
if(index % 2) {
|
||||
this_li.addClass(settings.classes.dropdownItem);
|
||||
} else {
|
||||
this_li.addClass(settings.classes.dropdownItem2);
|
||||
}
|
||||
|
||||
if(index === 0) {
|
||||
select_dropdown_item(this_li);
|
||||
}
|
||||
|
||||
$.data(this_li.get(0), "tokeninput", value);
|
||||
});
|
||||
|
||||
show_dropdown();
|
||||
|
||||
if(settings.animateDropdown) {
|
||||
dropdown_ul.slideDown("fast");
|
||||
} else {
|
||||
dropdown_ul.show();
|
||||
}
|
||||
} else {
|
||||
if(settings.noResultsText) {
|
||||
dropdown.html("<p>"+settings.noResultsText+"</p>");
|
||||
show_dropdown();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Highlight an item in the results dropdown
|
||||
function select_dropdown_item (item) {
|
||||
if(item) {
|
||||
if(selected_dropdown_item) {
|
||||
deselect_dropdown_item($(selected_dropdown_item));
|
||||
}
|
||||
|
||||
item.addClass(settings.classes.selectedDropdownItem);
|
||||
selected_dropdown_item = item.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove highlighting from an item in the results dropdown
|
||||
function deselect_dropdown_item (item) {
|
||||
item.removeClass(settings.classes.selectedDropdownItem);
|
||||
selected_dropdown_item = null;
|
||||
}
|
||||
|
||||
// Do a search and show the "searching" dropdown if the input is longer
|
||||
// than settings.minChars
|
||||
function do_search() {
|
||||
var query = input_box.val().toLowerCase();
|
||||
|
||||
if(query && query.length) {
|
||||
if(selected_token) {
|
||||
deselect_token($(selected_token), POSITION.AFTER);
|
||||
}
|
||||
|
||||
if(query.length >= settings.minChars) {
|
||||
show_dropdown_searching();
|
||||
clearTimeout(timeout);
|
||||
|
||||
timeout = setTimeout(function(){
|
||||
run_search(query);
|
||||
}, settings.searchDelay);
|
||||
} else {
|
||||
hide_dropdown();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Do the actual search
|
||||
function run_search(query) {
|
||||
var cache_key = query + computeURL();
|
||||
var cached_results = cache.get(cache_key);
|
||||
if(cached_results) {
|
||||
populate_dropdown(query, cached_results);
|
||||
} else {
|
||||
// Are we doing an ajax search or local data search?
|
||||
if(settings.url) {
|
||||
var url = computeURL();
|
||||
// Extract exisiting get params
|
||||
var ajax_params = {};
|
||||
ajax_params.data = {};
|
||||
if(url.indexOf("?") > -1) {
|
||||
var parts = url.split("?");
|
||||
ajax_params.url = parts[0];
|
||||
|
||||
var param_array = parts[1].split("&");
|
||||
$.each(param_array, function (index, value) {
|
||||
var kv = value.split("=");
|
||||
ajax_params.data[kv[0]] = kv[1];
|
||||
});
|
||||
} else {
|
||||
ajax_params.url = url;
|
||||
}
|
||||
|
||||
// Prepare the request
|
||||
ajax_params.data[settings.queryParam] = query;
|
||||
ajax_params.type = settings.method;
|
||||
ajax_params.dataType = settings.contentType;
|
||||
if(settings.crossDomain) {
|
||||
ajax_params.dataType = "jsonp";
|
||||
}
|
||||
|
||||
// Attach the success callback
|
||||
ajax_params.success = function(results) {
|
||||
if($.isFunction(settings.onResult)) {
|
||||
results = settings.onResult.call(hidden_input, results);
|
||||
}
|
||||
cache.add(cache_key, settings.jsonContainer ? results[settings.jsonContainer] : results);
|
||||
|
||||
// only populate the dropdown if the results are associated with the active search query
|
||||
if(input_box.val().toLowerCase() === query) {
|
||||
populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results);
|
||||
}
|
||||
};
|
||||
|
||||
// Make the request
|
||||
$.ajax(ajax_params);
|
||||
} else if(settings.local_data) {
|
||||
// Do the search through local data
|
||||
var results = $.grep(settings.local_data, function (row) {
|
||||
return row[settings.propertyToSearch].toLowerCase().indexOf(query.toLowerCase()) > -1;
|
||||
});
|
||||
|
||||
if($.isFunction(settings.onResult)) {
|
||||
results = settings.onResult.call(hidden_input, results);
|
||||
}
|
||||
cache.add(cache_key, results);
|
||||
populate_dropdown(query, results);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// compute the dynamic URL
|
||||
function computeURL() {
|
||||
var url = settings.url;
|
||||
if(typeof settings.url == 'function') {
|
||||
url = settings.url.call();
|
||||
}
|
||||
return url;
|
||||
}
|
||||
};
|
||||
|
||||
// Really basic cache for the results
|
||||
$.TokenList.Cache = function (options) {
|
||||
var settings = $.extend({
|
||||
max_size: 500
|
||||
}, options);
|
||||
|
||||
var data = {};
|
||||
var size = 0;
|
||||
|
||||
var flush = function () {
|
||||
data = {};
|
||||
size = 0;
|
||||
};
|
||||
|
||||
this.add = function (query, results) {
|
||||
if(size > settings.max_size) {
|
||||
flush();
|
||||
}
|
||||
|
||||
if(!data[query]) {
|
||||
size += 1;
|
||||
}
|
||||
|
||||
data[query] = results;
|
||||
};
|
||||
|
||||
this.get = function (query) {
|
||||
return data[query];
|
||||
};
|
||||
};
|
||||
}(jQuery));
|
||||
+11
File diff suppressed because one or more lines are too long
@@ -27,14 +27,15 @@ namespace ETS_WS.WS
|
||||
// inizializzo risposta
|
||||
List<string> suggerimenti = new List<string>();
|
||||
// proseguo SOLO SE min "MinCharAutocomplete" char...
|
||||
if (count >= Convert.ToInt32(ConfigurationManager.AppSettings.Get("MinCharAutocomplete")))
|
||||
if (count >= Convert.ToInt32(ConfigurationManager.AppSettings.Get("MinCharAutocomplete")))
|
||||
{
|
||||
// elenco candidati
|
||||
DS_utils.v_selFontiDataTable tabella = utils.obj.taSelFonti.getByLikeSearch(prefixText);
|
||||
// aggiungo ogni riga...
|
||||
foreach (DS_utils.v_selFontiRow riga in tabella)
|
||||
{
|
||||
suggerimenti.Add(riga.label);
|
||||
//suggerimenti.Add(riga.label);
|
||||
suggerimenti.Add(AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(riga.label, riga.value));
|
||||
}
|
||||
}
|
||||
return suggerimenti.ToArray();
|
||||
@@ -52,7 +53,8 @@ namespace ETS_WS.WS
|
||||
// aggiungo ogni riga...
|
||||
foreach (DS_utils.v_selCommesseRow riga in tabella)
|
||||
{
|
||||
suggerimenti.Add(riga.label);
|
||||
//suggerimenti.Add(riga.label);
|
||||
suggerimenti.Add(AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(riga.label, riga.value.ToString()));
|
||||
}
|
||||
}
|
||||
return suggerimenti.ToArray();
|
||||
@@ -70,11 +72,30 @@ namespace ETS_WS.WS
|
||||
// aggiungo ogni riga...
|
||||
foreach (DS_utils.v_selFasiRow riga in tabella)
|
||||
{
|
||||
suggerimenti.Add(riga.label);
|
||||
//suggerimenti.Add(riga.label);
|
||||
suggerimenti.Add(AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(riga.label, riga.value.ToString()));
|
||||
}
|
||||
}
|
||||
return suggerimenti.ToArray();
|
||||
}
|
||||
|
||||
|
||||
[System.Web.Services.WebMethod]
|
||||
[System.Web.Script.Services.ScriptMethod]
|
||||
public string[] GetCompletionList(string prefixText, int count)
|
||||
{
|
||||
// your code for retrieve the entities filtered by prefixText
|
||||
// this example returns the complete list, discarding the prefixText filter
|
||||
|
||||
return new[]
|
||||
{
|
||||
AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem("Luca", "1"),
|
||||
AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem("Luciano", "2"),
|
||||
AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem("Lucio", "3"),
|
||||
AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem("Alessandro", "4"),
|
||||
AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem("Alessio", "5")
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<add key="appName" value="ETS-WS" />
|
||||
<add key="SiteName" value="ETS" />
|
||||
<add key="mainRev" value="0.2" />
|
||||
<add key="minRev" value="27" />
|
||||
<add key="minRev" value="28" />
|
||||
<add key="copyRight" value="SteamWare, ETS © 2012" />
|
||||
<add key="tempUplDir" value="~/TempUploads" />
|
||||
<!--update pagina-->
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
<%@ Register Src="../WebUserControls/mod_testata.ascx" TagName="mod_testata" TagPrefix="uc1" %>
|
||||
<%@ Register Src="../WebUserControls/mod_menuBottomFullpage.ascx" TagName="mod_menuBottomFullpage"
|
||||
TagPrefix="uc2" %>
|
||||
<% if (false)
|
||||
{ %>
|
||||
<script src="../Scripts/jquery-1.6.4-vsdoc.js" type="text/javascript"></script>
|
||||
<% } %>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head id="Head1" runat="server">
|
||||
@@ -12,25 +16,28 @@
|
||||
<link href="../css/Style.css" rel="stylesheet" type="text/css" />
|
||||
<link rel="icon" href="../images/favicon.png" type="image/png" />
|
||||
<link rel="shortcut icon" href="../images/favicon.png" type="image/png" />
|
||||
<%--Area jQueryUI--%>
|
||||
<script src="../Scripts/jquery-1.4.4.min.js" type="text/javascript"></script>
|
||||
<%--Area jQueryUI via CDN--%>
|
||||
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.4.min.js"></script>
|
||||
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.23/jquery-ui.min.js"></script>
|
||||
<link rel="Stylesheet" type="text/css" href="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.23/themes/base/jquery-ui.css">
|
||||
|
||||
<%--Area jQuery via delivery locale--%>
|
||||
<%--<script src="../Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
|
||||
<script src="../Scripts/jquery-ui-1.8.23.min.js" type="text/javascript"></script>
|
||||
<link href="../Content/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<link href="../Content/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />--%>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
$(".radioBtn").buttonset();
|
||||
$(".submit").button();
|
||||
|
||||
// oggetto da legare all'update parziale ajax x sistemare btns & co
|
||||
var prm = Sys.WebForms.PageRequestManager.getInstance();
|
||||
|
||||
prm.add_endRequest(function () {
|
||||
// re-bind your jQuery events here
|
||||
$(".radioBtn").buttonset();
|
||||
$(".submit").button();
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
@@ -46,7 +53,6 @@
|
||||
<uc1:mod_testata ID="mod_testata1" runat="server" />
|
||||
</div>
|
||||
<div class="clearDiv">
|
||||
|
||||
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
|
||||
</asp:ContentPlaceHolder>
|
||||
</div>
|
||||
|
||||
@@ -12,61 +12,69 @@
|
||||
<div>
|
||||
<div class="divSx" style="width: 100%; text-align: left; margin: auto auto auto auto;
|
||||
background-color: #DEDEDE; height: 480px; vertical-align: middle;">
|
||||
<%--input dati--%>
|
||||
<div class="clearDiv">
|
||||
<div data-role="content" style="padding: 2px">
|
||||
<div data-role="fieldcontain">
|
||||
<fieldset data-role="controlgroup">
|
||||
<label for="tglProtocollo" class="labelInput">
|
||||
Protocollo
|
||||
</label>
|
||||
<select name="tglProtocollo" id="tglProtocollo" data-theme="" data-role="slider">
|
||||
<option value="off">No</option>
|
||||
<option value="on">Si</option>
|
||||
</select>
|
||||
</fieldset>
|
||||
<div style="padding: 4px;">
|
||||
<%--input dati--%>
|
||||
<div class="clearDiv">
|
||||
<div class="divSx">
|
||||
<asp:Label runat="server" ID="lblProtocollo" Text="Protocollo" CssClass="labelInput" /><br />
|
||||
<asp:RadioButtonList ID="rblProto" runat="server" AutoPostBack="true" RepeatDirection="Horizontal"
|
||||
RepeatLayout="Flow" CssClass="radioBtn" OnSelectedIndexChanged="rblProto_SelectedIndexChanged">
|
||||
<asp:ListItem Value="0" Text="No" />
|
||||
<asp:ListItem Value="1" Text="Si" />
|
||||
</asp:RadioButtonList>
|
||||
</div>
|
||||
<div class="divDx fontMedio" style="padding-top: 16px; padding-right: 4px;">
|
||||
<asp:Label runat="server" ID="lblNumProto" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearDiv">
|
||||
<asp:label runat="server" id="lblFonte" text="Fonte" cssclass="labelInput" /><br />
|
||||
<asp:textbox runat="server" id="txtFonte" width="20em" />
|
||||
<asp:autocompleteextender id="aceFonte" runat="server" targetcontrolid="txtFonte"
|
||||
completionlistcssclass="CompletionListCssClass" completionlistitemcssclass="autocomplete"
|
||||
completionlisthighlighteditemcssclass="autocompleteHiglight" servicepath="~/WS/AutoCompletamento.asmx"
|
||||
servicemethod="elencoFonti" minimumprefixlength="3" completioninterval="100" />
|
||||
</div>
|
||||
<div class="clearDiv">
|
||||
<asp:label runat="server" id="lblCommessa" text="Commessa" cssclass="labelInput" /><br />
|
||||
<asp:textbox runat="server" id="txtCommessa" width="15em" />
|
||||
<asp:autocompleteextender id="aceCommessa" runat="server" targetcontrolid="txtCommessa"
|
||||
completionlistcssclass="CompletionListCssClass" completionlistitemcssclass="autocomplete"
|
||||
completionlisthighlighteditemcssclass="autocompleteHiglight" servicepath="~/WS/AutoCompletamento.asmx"
|
||||
servicemethod="elencoCommesse" minimumprefixlength="2" completioninterval="100" />
|
||||
<div class="clearDiv">
|
||||
<asp:Label runat="server" ID="lblFonte" Text="Fonte" CssClass="labelInput" /><br />
|
||||
<script type="text/javascript">
|
||||
function SetSelectedValue(source, eventArgs) {
|
||||
document.getElementById('<%= hiddenFieldID.ClientID %>').value = 'Key: ' + eventArgs.get_value() + ' - Text: ' + eventArgs.get_text();
|
||||
}
|
||||
</script>
|
||||
<asp:TextBox runat="server" ID="txtFonte" Width="20em" />
|
||||
<asp:AutoCompleteExtender ID="aceFonte" runat="server" TargetControlID="txtFonte"
|
||||
CompletionListCssClass="CompletionListCssClass" CompletionListItemCssClass="autocomplete"
|
||||
CompletionListHighlightedItemCssClass="autocompleteHiglight" ServicePath="~/WS/AutoCompletamento.asmx"
|
||||
ServiceMethod="elencoFonti" MinimumPrefixLength="3" CompletionInterval="50" OnClientItemSelected="SetSelectedValue" />
|
||||
<br />
|
||||
<asp:Label runat="server" ID="Label1" Text="ID (hidden field)" />
|
||||
<asp:TextBox runat="server" ID="hiddenFieldID" ReadOnly="true" />
|
||||
</div>
|
||||
<div class="clearDiv">
|
||||
<asp:Label runat="server" ID="lblCommessa" Text="Commessa" CssClass="labelInput" /><br />
|
||||
<asp:TextBox runat="server" ID="txtCommessa" Width="15em" />
|
||||
<asp:AutoCompleteExtender ID="aceCommessa" runat="server" TargetControlID="txtCommessa"
|
||||
CompletionListCssClass="CompletionListCssClass" CompletionListItemCssClass="autocomplete"
|
||||
CompletionListHighlightedItemCssClass="autocompleteHiglight" ServicePath="~/WS/AutoCompletamento.asmx"
|
||||
ServiceMethod="elencoCommesse" MinimumPrefixLength="2" CompletionInterval="50" />
|
||||
<br />
|
||||
calcolati: Num Commessa | Committente | descr commessa
|
||||
</div>
|
||||
<div class="clearDiv">
|
||||
<asp:Label runat="server" ID="lblFase" Text="Fase" CssClass="labelInput" /><br />
|
||||
<asp:TextBox runat="server" ID="txtFase" Width="10em" />
|
||||
<asp:AutoCompleteExtender ID="aceFase" runat="server" TargetControlID="txtFase" CompletionListCssClass="CompletionListCssClass"
|
||||
CompletionListItemCssClass="autocomplete" CompletionListHighlightedItemCssClass="autocompleteHiglight"
|
||||
ServicePath="~/WS/AutoCompletamento.asmx" ServiceMethod="elencoFasi" MinimumPrefixLength="2"
|
||||
CompletionInterval="50" />
|
||||
</div>
|
||||
<div class="clearDiv">
|
||||
<asp:Label runat="server" ID="lblOggetto" Text="Oggetto" CssClass="labelInput" /><br />
|
||||
<asp:TextBox runat="server" ID="txtOggetto" Width="20em" />
|
||||
(campo libero)
|
||||
</div>
|
||||
<br />
|
||||
calcolati: Num Commessa | Committente | descr commessa
|
||||
</div>
|
||||
<div class="clearDiv">
|
||||
<asp:label runat="server" id="lblFase" text="Fase" cssclass="labelInput" /><br />
|
||||
<asp:textbox runat="server" id="txtFase" width="10em" />
|
||||
<asp:autocompleteextender id="aceFase" runat="server" targetcontrolid="txtFase" completionlistcssclass="CompletionListCssClass"
|
||||
completionlistitemcssclass="autocomplete" completionlisthighlighteditemcssclass="autocompleteHiglight"
|
||||
servicepath="~/WS/AutoCompletamento.asmx" servicemethod="elencoFasi" minimumprefixlength="2"
|
||||
completioninterval="100" />
|
||||
</div>
|
||||
<div class="clearDiv">
|
||||
<asp:label runat="server" id="lblOggetto" text="Oggetto" cssclass="labelInput" /><br />
|
||||
<asp:textbox runat="server" id="txtOggetto" width="20em" />
|
||||
(campo libero)
|
||||
</div>
|
||||
<br />
|
||||
<div class="clearDiv">
|
||||
path + nome file | cambia
|
||||
</div>
|
||||
<br />
|
||||
<div class="clearDiv">
|
||||
generatore:<br />
|
||||
Lettera (doc) | FAX (doc) | Email
|
||||
<div class="clearDiv">
|
||||
path + nome file | cambia
|
||||
</div>
|
||||
<br />
|
||||
<div class="clearDiv">
|
||||
generatore:<br />
|
||||
Lettera (doc) | FAX (doc) | Email
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%--buttons finali--%>
|
||||
|
||||
@@ -11,7 +11,24 @@ namespace ETS_WS.WebUserControls
|
||||
{
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
if (!Page.IsPostBack)
|
||||
{
|
||||
rblProto.SelectedIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
protected void rblProto_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
// decido se mostrare il protocollo...
|
||||
bool showProto = false;
|
||||
try
|
||||
{
|
||||
showProto = rblProto.SelectedValue == "1";
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
lblNumProto.Visible = showProto;
|
||||
lblNumProto.Text = DateTime.Now.ToString("HHmmss");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,33 @@ namespace ETS_WS.WebUserControls {
|
||||
|
||||
public partial class mod_inputDati {
|
||||
|
||||
/// <summary>
|
||||
/// lblProtocollo control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Label lblProtocollo;
|
||||
|
||||
/// <summary>
|
||||
/// rblProto control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.RadioButtonList rblProto;
|
||||
|
||||
/// <summary>
|
||||
/// lblNumProto control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Label lblNumProto;
|
||||
|
||||
/// <summary>
|
||||
/// lblFonte control.
|
||||
/// </summary>
|
||||
@@ -39,6 +66,24 @@ namespace ETS_WS.WebUserControls {
|
||||
/// </remarks>
|
||||
protected global::AjaxControlToolkit.AutoCompleteExtender aceFonte;
|
||||
|
||||
/// <summary>
|
||||
/// Label1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Label Label1;
|
||||
|
||||
/// <summary>
|
||||
/// hiddenFieldID control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox hiddenFieldID;
|
||||
|
||||
/// <summary>
|
||||
/// lblCommessa control.
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="mod_textAutocomplete.ascx.cs"
|
||||
Inherits="ETS_WS.WebUserControls.mod_textAutocomplete" %>
|
||||
<% if (false)
|
||||
{ %>
|
||||
<script src="../Scripts/jquery-1.6.4-vsdoc.js" type="text/javascript"></script>
|
||||
<% } %>
|
||||
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
|
||||
<asp:TextBox runat="server" ID="hiddenFieldID" AutoPostBack="true" OnTextChanged="hiddenFieldID_TextChanged"
|
||||
Visible="true" ViewStateMode="Enabled" Width="5em" Font-Size="X-Small" />
|
||||
<asp:TextBox runat="server" ID="txtValue" Width="20em" />
|
||||
<asp:AutoCompleteExtender ID="txtValueAce" runat="server" TargetControlID="txtValue"
|
||||
ServicePath="~/WS/AutoCompletamento.asmx" ServiceMethod="elencoFonti" CompletionInterval="50"
|
||||
MinimumPrefixLength="1" CompletionListCssClass="CompletionListCssClass" CompletionListItemCssClass="autocomplete"
|
||||
CompletionListHighlightedItemCssClass="autocompleteHiglight" />
|
||||
@@ -0,0 +1,121 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using ETS_Data;
|
||||
|
||||
namespace ETS_WS.WebUserControls
|
||||
{
|
||||
public partial class mod_textAutocomplete : System.Web.UI.UserControl
|
||||
{
|
||||
/// <summary>
|
||||
/// evento valore selezionato
|
||||
/// </summary>
|
||||
public event EventHandler eh_valSelezionato;
|
||||
|
||||
/// <summary>
|
||||
/// avvio pagina
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
string uid = this.UniqueID;
|
||||
ClientScriptManager script = Page.ClientScript;
|
||||
if (!script.IsClientScriptBlockRegistered(this.GetType(), uid + "_Alert"))
|
||||
{
|
||||
string pre = "<script type=text/javascript>";
|
||||
string scrVal = "function " + uid + "_SetSelectedValue(source, eventArgs) { document.getElementById('" + uid + "_hiddenFieldID').value = eventArgs.get_value(); }";
|
||||
string post = "</script>";
|
||||
string fullScript = string.Format("{0} {1} {2}", pre, scrVal, post);
|
||||
script.RegisterClientScriptBlock(this.GetType(), uid + "_Alert", fullScript);
|
||||
|
||||
}
|
||||
txtValueAce.OnClientItemSelected = string.Format("{0}_SetSelectedValue", uid);
|
||||
}
|
||||
/// <summary>
|
||||
/// salvo valore selezionato!
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
protected void hiddenFieldID_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
_valore = hiddenFieldID.Text;
|
||||
if (eh_valSelezionato!= null)
|
||||
{
|
||||
eh_valSelezionato(this, new EventArgs());
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// valore selezionato dal controllo (RW local)
|
||||
/// </summary>
|
||||
protected string _valore
|
||||
{
|
||||
get
|
||||
{
|
||||
return utils.obj.StringSessionObj(this.UniqueID + "_sel");
|
||||
}
|
||||
set
|
||||
{
|
||||
utils.obj.setSessionVal(this.UniqueID + "_sel", value);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// valore selezionato dal controllo (R public)
|
||||
/// </summary>
|
||||
public string valore
|
||||
{
|
||||
get
|
||||
{
|
||||
return hiddenFieldID.Text;
|
||||
//return utils.obj.StringSessionObj(this.UniqueID + "_sel");
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// num minimo caratteri x autocomplete
|
||||
/// </summary>
|
||||
public Int32 minCharAutocomplete
|
||||
{
|
||||
set
|
||||
{
|
||||
txtValueAce.MinimumPrefixLength = value;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// path del webservice
|
||||
/// </summary>
|
||||
public string ServicePath
|
||||
{
|
||||
set
|
||||
{
|
||||
txtValueAce.ServicePath = value;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// metodo da invocare x autocompletamento
|
||||
/// </summary>
|
||||
public string ServiceMethod
|
||||
{
|
||||
set
|
||||
{
|
||||
txtValueAce.ServiceMethod = value;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// imposta visibilità della textBox delle chiavi
|
||||
/// </summary>
|
||||
public bool showKey
|
||||
{
|
||||
set
|
||||
{
|
||||
if (!value)
|
||||
{
|
||||
hiddenFieldID.Width = Unit.Pixel(0);
|
||||
}
|
||||
//hiddenFieldID.Visible = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace ETS_WS.WebUserControls {
|
||||
|
||||
|
||||
public partial class mod_textAutocomplete {
|
||||
|
||||
/// <summary>
|
||||
/// hiddenFieldID control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox hiddenFieldID;
|
||||
|
||||
/// <summary>
|
||||
/// txtValue control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtValue;
|
||||
|
||||
/// <summary>
|
||||
/// txtValueAce control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::AjaxControlToolkit.AutoCompleteExtender txtValueAce;
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -23,6 +23,6 @@
|
||||
<rules>
|
||||
<!-- logging rules -->
|
||||
<logger name="*" minlevel="Trace" writeTo="f" />
|
||||
<logger name="*" minlevel="Trace" writeTo="sentinel" />
|
||||
<!--<logger name="*" minlevel="Trace" writeTo="sentinel" />-->
|
||||
</rules>
|
||||
</nlog>
|
||||
File diff suppressed because one or more lines are too long
@@ -2,8 +2,9 @@
|
||||
<packages>
|
||||
<package id="AjaxControlToolkit" version="4.1.60623" targetFramework="net40" />
|
||||
<package id="AjaxMin" version="4.59.4576.13504" targetFramework="net40" />
|
||||
<package id="jQuery" version="1.4.4" targetFramework="net40" />
|
||||
<package id="jQuery" version="1.6.4" targetFramework="net40" />
|
||||
<package id="jQuery.UI.Combined" version="1.8.23" targetFramework="net40" />
|
||||
<package id="jquery-tokeninput" version="1.6.0" targetFramework="net40" />
|
||||
<package id="NLog" version="2.0.0.2000" targetFramework="net40" />
|
||||
<package id="NLog.Config" version="2.0.0.2000" targetFramework="net40" />
|
||||
<package id="NLog.Schema" version="2.0.0.2000" targetFramework="net40" />
|
||||
|
||||
+32
-8
@@ -1,27 +1,50 @@
|
||||
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="ETS_WS.test" %>
|
||||
|
||||
<%@ Register Src="WebUserControls/mod_textAutocomplete.ascx" TagName="mod_textAutocomplete"
|
||||
TagPrefix="uc1" %>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<%--<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
|
||||
<% if (false)
|
||||
{ %>
|
||||
<script src="../Scripts/jquery-1.6.4-vsdoc.js" type="text/javascript"></script>
|
||||
<% } %>
|
||||
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
|
||||
<%--
|
||||
<%@ Register src="WebUserControls/mod_fileUpload.ascx" tagname="mod_fileUpload" tagprefix="uc1" %>--%>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head runat="server">
|
||||
<title>pagina di test</title>
|
||||
<script src="Scripts/jquery-1.4.4.min.js" type="text/javascript"></script>
|
||||
<link href="../css/Style.css" rel="stylesheet" type="text/css" />
|
||||
<link rel="icon" href="../images/favicon.png" type="image/png" />
|
||||
<link rel="shortcut icon" href="../images/favicon.png" type="image/png" />
|
||||
<script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
|
||||
<script src="Scripts/jquery-ui-1.8.23.min.js" type="text/javascript"></script>
|
||||
<link href="Content/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />
|
||||
<script src="Scripts/jquery.tokeninput.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
$("#radio").buttonset();
|
||||
$(".radioBtn").buttonset();
|
||||
$(".submit").button();
|
||||
$(".submit").button();
|
||||
$("#Name").tokenInput("/url/to/your/script/");
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<form id="form1" runat="server">
|
||||
<div>
|
||||
<%--<asp:ScriptManager ID="ScriptManager1" runat="server">
|
||||
<asp:ScriptManager ID="ScriptManager1" runat="server">
|
||||
</asp:ScriptManager>
|
||||
<div style="background-color: Orange;">
|
||||
<uc1:mod_textAutocomplete ID="mod_textAutocomplete1" runat="server" ServicePath="~/WS/AutoCompletamento.asmx"
|
||||
ServiceMethod="elencoFonti" showKey="false" minCharAutocomplete="3" />
|
||||
<asp:TextBox runat="server" ID="txtVal1" />
|
||||
</div>
|
||||
<div style="background-color: Yellow;">
|
||||
<uc1:mod_textAutocomplete ID="mod_textAutocomplete2" runat="server" ServicePath="~/WS/AutoCompletamento.asmx"
|
||||
ServiceMethod="elencoCommesse" showKey="false" minCharAutocomplete="4" />
|
||||
<asp:TextBox runat="server" ID="txtVal2" />
|
||||
</div>
|
||||
<%--
|
||||
<uc1:mod_fileUpload ID="mod_fileUpload1" runat="server" />--%>
|
||||
<div id="radio">
|
||||
<input type="radio" id="radio1" name="radio" /><label for="radio1">Choice 1</label>
|
||||
@@ -33,10 +56,11 @@
|
||||
Please fill out your information:
|
||||
<div>
|
||||
Name:
|
||||
<asp:TextBox ID="Name" runat="server"></asp:TextBox></div>
|
||||
<asp:TextBox ID="Name" runat="server"></asp:TextBox>
|
||||
</div>
|
||||
<div>
|
||||
Sex:<asp:RadioButtonList ID="sex" runat="server" CssClass="radioBtn"
|
||||
RepeatDirection="Horizontal" onselectedindexchanged="sex_SelectedIndexChanged" AutoPostBack="true">
|
||||
Sex:<asp:RadioButtonList ID="sex" runat="server" CssClass="radioBtn" RepeatDirection="Horizontal"
|
||||
OnSelectedIndexChanged="sex_SelectedIndexChanged" AutoPostBack="true">
|
||||
<asp:ListItem Text="Male"></asp:ListItem>
|
||||
<asp:ListItem Text="Female"></asp:ListItem>
|
||||
</asp:RadioButtonList>
|
||||
@@ -44,7 +68,7 @@
|
||||
<div>
|
||||
Age:
|
||||
<asp:RadioButtonList ID="age" runat="server" RepeatDirection="Horizontal" CssClass="radioBtn"
|
||||
onselectedindexchanged="age_SelectedIndexChanged" AutoPostBack="true">
|
||||
OnSelectedIndexChanged="age_SelectedIndexChanged" AutoPostBack="true">
|
||||
<asp:ListItem>10-20</asp:ListItem>
|
||||
<asp:ListItem>21-35</asp:ListItem>
|
||||
<asp:ListItem>36-50</asp:ListItem>
|
||||
|
||||
@@ -13,7 +13,20 @@ namespace ETS_WS
|
||||
{
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
mod_textAutocomplete1.eh_valSelezionato += new EventHandler(mod_textAutocomplete1_eh_valSelezionato);
|
||||
mod_textAutocomplete2.eh_valSelezionato += new EventHandler(mod_textAutocomplete2_eh_valSelezionato);
|
||||
txtVal2.Text = mod_textAutocomplete2.valore;
|
||||
txtVal1.Text = mod_textAutocomplete1.valore;
|
||||
}
|
||||
|
||||
void mod_textAutocomplete2_eh_valSelezionato(object sender, EventArgs e)
|
||||
{
|
||||
txtVal2.Text = mod_textAutocomplete2.valore;
|
||||
}
|
||||
|
||||
void mod_textAutocomplete1_eh_valSelezionato(object sender, EventArgs e)
|
||||
{
|
||||
txtVal1.Text = mod_textAutocomplete1.valore;
|
||||
}
|
||||
|
||||
protected void sex_SelectedIndexChanged(object sender, EventArgs e)
|
||||
|
||||
Generated
+45
@@ -21,6 +21,51 @@ namespace ETS_WS {
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
|
||||
|
||||
/// <summary>
|
||||
/// ScriptManager1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.ScriptManager ScriptManager1;
|
||||
|
||||
/// <summary>
|
||||
/// mod_textAutocomplete1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::ETS_WS.WebUserControls.mod_textAutocomplete mod_textAutocomplete1;
|
||||
|
||||
/// <summary>
|
||||
/// txtVal1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtVal1;
|
||||
|
||||
/// <summary>
|
||||
/// mod_textAutocomplete2 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::ETS_WS.WebUserControls.mod_textAutocomplete mod_textAutocomplete2;
|
||||
|
||||
/// <summary>
|
||||
/// txtVal2 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtVal2;
|
||||
|
||||
/// <summary>
|
||||
/// Name control.
|
||||
/// </summary>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+20
@@ -0,0 +1,20 @@
|
||||
param($installPath, $toolsPath, $package, $project)
|
||||
|
||||
$extId = "JScriptIntelliSenseParaExtension.Microsoft.039ee76c-3c7f-4281-ad23-f6528ab18623"
|
||||
$extManager = [Microsoft.VisualStudio.Shell.Package]::GetGlobalService([Microsoft.VisualStudio.ExtensionManager.SVsExtensionManager])
|
||||
$copyOverParaFile = $false
|
||||
try {
|
||||
$copyOverParaFile = $extManager.GetInstalledExtension($extId).State -eq "Enabled"
|
||||
}
|
||||
catch [Microsoft.VisualStudio.ExtensionManager.NotInstalledException] {
|
||||
#Extension is not installed
|
||||
}
|
||||
|
||||
if ($copyOverParaFile) {
|
||||
#Copy the -vsdoc-para file over the -vsdoc file
|
||||
#$projectFolder = Split-Path -Parent $project.FileName
|
||||
$projectFolder = $project.Properties.Item("FullPath").Value
|
||||
$paraVsDocPath = Join-Path $toolsPath jquery-1.6.4-vsdoc-para.js
|
||||
$vsDocPath = Join-Path $projectFolder Scripts\jquery-1.6.4-vsdoc.js
|
||||
Copy-Item $paraVsDocPath $vsDocPath -Force
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,46 @@
|
||||
param($installPath, $toolsPath, $package, $project)
|
||||
|
||||
#Forcibly delete the -vsdoc file
|
||||
#$projectFolder = Split-Path -Parent $project.FileName
|
||||
$projectFolder = $project.Properties.Item("FullPath").Value
|
||||
$projVsDocPath = Join-Path $projectFolder Scripts\jquery-1.6.4-vsdoc.js
|
||||
$origVsDocPath = Join-Path $installPath Content\Scripts\jquery-1.6.4-vsdoc.js
|
||||
$origVsDocParaPath = Join-Path $toolsPath jquery-1.6.4-vsdoc-para.js
|
||||
|
||||
function Get-Checksum($file) {
|
||||
$cryptoProvider = New-Object "System.Security.Cryptography.MD5CryptoServiceProvider"
|
||||
|
||||
$fileInfo = Get-Item "$file"
|
||||
trap { ;
|
||||
continue } $stream = $fileInfo.OpenRead()
|
||||
if ($? -eq $false) {
|
||||
#Write-Host "Couldn't open file for reading"
|
||||
return $null
|
||||
}
|
||||
|
||||
$bytes = $cryptoProvider.ComputeHash($stream)
|
||||
$checksum = ''
|
||||
foreach ($byte in $bytes) {
|
||||
$checksum += $byte.ToString('x2')
|
||||
}
|
||||
|
||||
$stream.Close() | Out-Null
|
||||
|
||||
return $checksum
|
||||
}
|
||||
|
||||
if (Test-Path $projVsDocPath) {
|
||||
#Copy the original -vsdoc file over the -vsdoc file modified during install
|
||||
#Normal uninstall logic will then kick in
|
||||
|
||||
if ((Get-Checksum $projVsDocPath) -eq (Get-Checksum $origVsDocParaPath)) {
|
||||
#Write-Host "Copying orig vsdoc file over"
|
||||
Copy-Item $origVsDocPath $projVsDocPath -Force
|
||||
}
|
||||
else {
|
||||
#Write-Host "vsdoc file has changed"
|
||||
}
|
||||
}
|
||||
else {
|
||||
#Write-Host "vsdoc file not found in project"
|
||||
}
|
||||
BIN
Binary file not shown.
Reference in New Issue
Block a user