[semantic-ui-dropdown] Add type definitions. (#16931)

This commit is contained in:
Leonard Thieu
2017-06-02 16:59:15 -07:00
committed by Mohamed Hegazy
parent 524b072a5a
commit 9a529e3477
5 changed files with 1103 additions and 0 deletions
+852
View File
@@ -0,0 +1,852 @@
interface JQuery {
dropdown: SemanticUI.Dropdown;
}
declare namespace SemanticUI {
// TODO: Should 'value'/'values' parameters be of type 'string' instead of 'any'?
interface Dropdown {
settings: DropdownSettings;
/**
* Recreates dropdown menu from select option values.
*/
(behavior: 'setup menu'): JQuery;
/**
* Refreshes all cached selectors and data
*/
(behavior: 'refresh'): JQuery;
/**
* Toggles current visibility of dropdown
*/
(behavior: 'toggle'): JQuery;
/**
* Shows dropdown
*/
(behavior: 'show'): JQuery;
/**
* Hides dropdown
*/
(behavior: 'hide'): JQuery;
/**
* Clears dropdown of selection
*/
(behavior: 'clear'): JQuery;
/**
* Hides all other dropdowns that is not current dropdown
*/
(behavior: 'hide others'): JQuery;
/**
* Restores dropdown text and value to its value on page load
*/
(behavior: 'restore defaults'): JQuery;
/**
* Restores dropdown text to its value on page load
*/
(behavior: 'restore default text'): JQuery;
/**
* Restores dropdown text to its prompt, placeholder text
*/
(behavior: 'restore placeholder text'): JQuery;
/**
* Restores dropdown value to its value on page load
*/
(behavior: 'restore default value'): JQuery;
/**
* Saves current text and value as new defaults (for use with restore)
*/
(behavior: 'save defaults'): JQuery;
/**
* Sets value as selected
*/
(behavior: 'set selected', value: any): JQuery;
/**
* Remove value from selected
*/
(behavior: 'remove selected', value: any): JQuery;
/**
* Adds a group of values as selected
*/
(behavior: 'set selected', values: any[]): JQuery;
/**
* Sets selected values to exactly specified values, removing current selection
*/
(behavior: 'set exactly', values: any[]): JQuery;
/**
* Sets dropdown text to a value
*/
(behavior: 'set text', text: string): JQuery;
/**
* Sets dropdown input to value (does not update display state)
*/
(behavior: 'set value', value: any): JQuery;
/**
* Returns current dropdown text
*/
(behavior: 'get text'): string;
/**
* Returns current dropdown input value
*/
(behavior: 'get value'): any;
/**
* Returns DOM element that matches a given input value
*/
(behavior: 'get item', value: any): JQuery;
/**
* Adds touch events to element
*/
(behavior: 'bind touch events'): JQuery;
/**
* Adds mouse events to element
*/
(behavior: 'bind mouse events'): JQuery;
/**
* Binds a click to document to determine if you click away from a dropdown
*/
(behavior: 'bind intent'): JQuery;
/**
* Unbinds document intent click
*/
(behavior: 'unbind intent'): JQuery;
/**
* Returns whether event occurred inside dropdown
*/
(behavior: 'determine intent'): boolean;
/**
* Triggers preset item selection action based on settings passing text/value
*/
(behavior: 'determine select action', text: string, value: any): JQuery;
/**
* Sets dropdown to active state
*/
(behavior: 'set active'): JQuery;
/**
* Sets dropdown to visible state
*/
(behavior: 'set visible'): JQuery;
/**
* Removes dropdown active state
*/
(behavior: 'remove active'): JQuery;
/**
* Removes dropdown visible state
*/
(behavior: 'remove visible'): JQuery;
/**
* Returns whether dropdown is a selection dropdown
*/
(behavior: 'is selection'): boolean;
/**
* Returns whether dropdown is animated
*/
(behavior: 'is animated'): boolean;
/**
* Returns whether dropdown is visible
*/
(behavior: 'is visible'): boolean;
/**
* Returns whether dropdown is hidden
*/
(behavior: 'is hidden'): boolean;
/**
* Returns dropdown value as set on page load
*/
(behavior: 'get default text'): string;
/**
* Returns placeholder text
*/
(behavior: 'get placeholder text'): string;
(behavior: 'destroy'): JQuery;
<K extends keyof DropdownSettings>(behavior: 'setting', name: K, value?: undefined): DropdownSettings[K];
<K extends keyof DropdownSettings>(behavior: 'setting', name: K, value: DropdownSettings[K]): JQuery;
(behavior: 'setting', value: DropdownSettings.Param): JQuery;
(settings?: DropdownSettings.Param): JQuery;
}
/**
* @see {@link http://semantic-ui.com/modules/dropdown.html#/settings}
*/
interface DropdownSettings extends Pick<DropdownSettings._Impl, keyof DropdownSettings._Impl> { }
namespace DropdownSettings {
type Param = DropdownSettings | object;
interface _Impl {
// region Frequently Used Settings
/**
* Event used to trigger dropdown (Hover, Click, Custom Event)
*
* @default 'click'
*/
on: string;
/**
* When set to true will fire onChange even when the value a user select matches the currently selected value.
*
* @default false
*/
allowReselection: boolean;
/**
* Whether search selection should allow users to add their own selections, works for single or multi-select.
*
* @default false
*/
allowAdditions: boolean;
/**
* When disabled user additions will appear in the results menu using a specially formatted selection item formatted by templates.addition.
*
* @default true
*/
hideAdditions: boolean;
/**
* Sets a default action to occur. (See usage guide)
*
* @default 'activate'
* @see {@link http://semantic-ui.com/modules/dropdown.html#/usage}
*/
action: 'activate' | 'select' | 'combo' | 'nothing' | 'hide' | ((this: JQuery, text: string, value: string | false, element: JQuery) => void);
/**
* The minimum characters for a search to begin showing results
*
* @default 1
*/
minCharacters: number;
/**
* When using search selection specifies how to match values.
*
* @default 'both'
*/
match: 'both' | 'value' | 'text';
/**
* Whether dropdown should select new option when using keyboard shortcuts. Setting to false will require enter or left click to confirm a choice.
*
* @default true
*/
selectOnKeydown: boolean;
/**
* Whether search selection will force currently selected choice when element is blurred.
*
* @default true
*/
forceSelection: boolean;
/**
* Whether menu items with sub-menus (categories) should be selectable
*
* @default false
*/
allowCategorySelection: boolean;
/**
* @default 'auto'
*/
placeholder: 'auto' | 'value' | false;
// endregion
// region Remote Settings
/**
* Can be set to an object to specify API settings for retrieving remote selection menu content from an API endpoint
*
* @default false
* @see {@link http://semantic-ui.com/behaviors/api.html}
*/
apiSettings: false | ApiSettings;
/**
* List mapping dropdown content to JSON Property when using API
*/
fields: Dropdown.FieldsSettings;
/**
* When enabled will automatically store selected name/value pairs in sessionStorage to preserve user selection on page refresh. Disabling will clear remote dropdown values on refresh.
*
* @default true
*/
saveRemoteData: boolean;
/**
* When set to true API will be expected to return the complete result set, which will then be filtered clientside to only display matching results.
*
* @default false
* @since 2.2.8
*/
filterRemoteData: boolean;
// endregion
// region Multiple Select Settings
/**
* Whether multiselect should use labels. Must be set to true when allowAdditions is true
*
* @default true
*/
useLabels: boolean;
/**
* When set to a number, sets the maximum number of selections
*
* @default false
*/
maxSelections: false | number;
/**
* Maximum glyph width, used to calculate search size. This is usually size of a "W" in your font in em
*
* @default 1.0714
*/
glyphWidth: number;
/**
* Allows customization of multi-select labels
*/
label: Dropdown.LabelSettings;
// endregion
// region Additional Settings
/**
* When set to auto determines direction based on whether dropdown can fit on screen. Set to upward or downward to always force a direction.
*
* @default 'auto'
*/
direction: 'auto' | 'upward' | 'downward';
/**
* Whether dropdown should try to keep itself on screen by checking whether menus display position in its context (Default context is page).
*
* @default true
*/
keepOnScreen: boolean;
/**
* Element context to use when checking whether can show when keepOnScreen: true
*
* @default 'window'
*/
context: string | JQuery;
/**
* Specifying to "true" will use a fuzzy full text search, setting to "exact" will force the exact search to be matched somewhere in the string
*
* @default false
*/
fullTextSearch: boolean | 'exact';
/**
* Whether HTML included in dropdown values should be preserved. (Allows icons to show up in selected value)
*
* @default true
*/
preserveHTML: boolean;
/**
* Whether to sort values when creating a dropdown automatically from a select element.
*
* @default false
*/
sortSelect: boolean;
/**
* Whether to show dropdown menu automatically on element focus.
*
* @default true
*/
showOnFocus: boolean;
/**
* Whether to allow the element to be navigable by keyboard, by automatically creating a tabindex
*
* @default true
*/
allowTab: boolean;
/**
* Named transition to use when animating menu in and out.
* Defaults to slide down or slide up depending on dropdown direction.
* Fade and slide down are available without including ui transitions
*
* @default 'auto'
* @see {@link http://semantic-ui.com/modules/transition.html}
*/
transition: 'auto' | string;
/**
* Duration of animation events
*
* @default 200
*/
duration: number;
/**
* The keycode used to represent keyboard shortcuts. To avoid issues with some foreign languages, you can pass false for comma delimiter's value
*/
keys: Dropdown.KeySettings;
/**
* Time in milliseconds to debounce show or hide behavior when on: hover is used, or when touch is used.
*/
delay: Dropdown.DelaySettings;
// endregion
// region Callbacks
/**
* Is called after a dropdown value changes. Receives the name and value of selection and the active menu element
*/
onChange(this: JQuery, value: any, text: string, $choice: JQuery): void;
/**
* Is called after a dropdown selection is added using a multiple select dropdown, only receives the added value
*/
onAdd(this: JQuery, addedValue: any, addedText: string, $addedChoice: JQuery): void;
/**
* Is called after a dropdown selection is removed using a multiple select dropdown, only receives the removed value
*/
onRemove(this: JQuery, removedValue: any, removedText: string, $removedChoice: JQuery): void;
/**
* Allows you to modify a label before it is added. Expects the jQ DOM element for a label to be returned.
*/
onLabelCreate(this: JQuery, value: any, text: string): JQuery;
/**
* Called when a label is remove, return false; will prevent the label from being removed.
*/
onLabelRemove(this: JQuery, value: any): false | void;
/**
* Is called after a label is selected by a user
*/
onLabelSelect(this: JQuery, $selectedLabels: JQuery): void;
/**
* Is called after a dropdown is searched with no matching values
*/
onNoResults(this: JQuery, searchValue: any): void;
/**
* Is called before a dropdown is shown. If false is returned, dropdown will not be shown.
*/
onShow(this: JQuery): false | void;
/**
* Is called before a dropdown is hidden. If false is returned, dropdown will not be hidden.
*/
onHide(this: JQuery): false | void;
// endregion
// region DOM Settings
/**
* You can specify site wide messages by modifying $.fn.dropdown.settings.message that will apply on any dropdown if it appears in the page.
*/
message: Dropdown.MessageSettings;
selector: Dropdown.SelectorSettings;
regExp: Dropdown.RegExpSettings;
metadata: Dropdown.MetadataSettings;
className: Dropdown.ClassNameSettings;
// endregion
// region Debug Settings
error: Dropdown.ErrorSettings;
// endregion
// region Component Settings
// region DOM Settings
/**
* Event namespace. Makes sure module teardown does not effect other events attached to an element.
*/
namespace: string;
// endregion
// region Debug Settings
/**
* Name used in log statements
*/
name: string;
/**
* Silences all console output including error messages, regardless of other debug settings.
*/
silent: boolean;
/**
* Debug output to console
*/
debug: boolean;
/**
* Show console.table output with performance metrics
*/
performance: boolean;
/**
* Debug output includes all internal behaviors
*/
verbose: boolean;
// endregion
// endregion
}
}
namespace Dropdown {
interface FieldsSettings extends Pick<FieldsSettings._Impl, keyof FieldsSettings._Impl> { }
namespace FieldsSettings {
type Param = FieldsSettings | object;
interface _Impl {
/**
* grouping for api results
*
* @default 'results'
*/
remoteValues: string;
/**
* grouping for all dropdown values
*
* @default 'values'
*/
values: string;
/**
* displayed dropdown text
*
* @default 'name'
*/
name: string;
/**
* actual dropdown value
*
* @default 'value'
*/
value: string;
}
}
interface LabelSettings extends Pick<LabelSettings._Impl, keyof LabelSettings._Impl> { }
namespace LabelSettings {
type Param = LabelSettings | object;
interface _Impl {
/**
* @default 'horizontal flip'
*/
transition: string;
/**
* @default 200
*/
duration: number;
/**
* @default false
*/
variation: false | string;
}
}
interface KeySettings extends Pick<KeySettings._Impl, keyof KeySettings._Impl> { }
namespace KeySettings {
type Param = KeySettings | object;
interface _Impl {
/**
* @default 8
*/
backspace: number;
/**
* @default 188
*/
delimiter: number | false;
/**
* @default 46
*/
deleteKey: number;
/**
* @default 13
*/
enter: number;
/**
* @default 27
*/
escape: number;
/**
* @default 33
*/
pageUp: number;
/**
* @default 34
*/
pageDown: number;
/**
* @default 37
*/
leftArrow: number;
/**
* @default 38
*/
upArrow: number;
/**
* @default 39
*/
rightArrow: number;
/**
* @default 40
*/
downArrow: number;
}
}
interface DelaySettings extends Pick<DelaySettings._Impl, keyof DelaySettings._Impl> { }
namespace DelaySettings {
type Param = DelaySettings | object;
interface _Impl {
/**
* @default 300
*/
hide: number;
/**
* @default 200
*/
show: number;
/**
* @default 50
*/
search: number;
/**
* @default 50
*/
touch: number;
}
}
interface MessageSettings extends Pick<MessageSettings._Impl, keyof MessageSettings._Impl> { }
namespace MessageSettings {
type Param = MessageSettings | object;
interface _Impl {
/**
* @default 'Add <b>{term}</b>'
*/
addResult: string;
/**
* @default '{count} selected'
*/
count: string;
/**
* @default 'Max {maxCount} selections'
*/
maxSelections: string;
/**
* 'No results found.'
*/
noResults: string;
}
}
interface SelectorSettings extends Pick<SelectorSettings._Impl, keyof SelectorSettings._Impl> { }
namespace SelectorSettings {
type Param = SelectorSettings | object;
interface _Impl {
/**
* @default '.addition'
*/
addition: string;
/**
* @default '.ui.dropdown'
*/
dropdown: string;
/**
* @default '> .dropdown.icon'
*/
icon: string;
/**
* @default '> input[type="hidden"], > select'
*/
input: string;
/**
* @default '.item'
*/
item: string;
/**
* @default '> .label'
*/
label: string;
/**
* @default '> .label > .delete.icon'
*/
remove: string;
/**
* @default '.label'
*/
siblingLabel: string;
/**
* @default '.menu'
*/
menu: string;
/**
* @default '.message'
*/
message: string;
/**
* @default '.dropdown.icon'
*/
menuIcon: string;
/**
* @default 'input.search, .menu > .search > input'
*/
search: string;
/**
* @default '> .text:not(.icon)'
*/
text: string;
}
}
interface RegExpSettings extends Pick<RegExpSettings._Impl, keyof RegExpSettings._Impl> { }
namespace RegExpSettings {
type Param = RegExpSettings | object;
interface _Impl {
/**
* @default /[-[\]{}()*+?.,\\^$|#\s]/g
*/
escape: RegExp;
}
}
interface MetadataSettings extends Pick<MetadataSettings._Impl, keyof MetadataSettings._Impl> { }
namespace MetadataSettings {
type Param = MetadataSettings | object;
interface _Impl {
/**
* @default 'defaultText'
*/
defaultText: string;
/**
* @default 'defaultValue'
*/
defaultValue: string;
/**
* @default 'placeholderText'
*/
placeholderText: string;
/**
* @default 'text'
*/
text: string;
/**
* @default 'value'
*/
value: string;
}
}
interface ClassNameSettings extends Pick<ClassNameSettings._Impl, keyof ClassNameSettings._Impl> { }
namespace ClassNameSettings {
type Param = ClassNameSettings | object;
interface _Impl {
/**
* @default 'active'
*/
active: string;
/**
* @default 'addition'
*/
addition: string;
/**
* @default 'animating'
*/
animating: string;
/**
* @default 'disabled'
*/
disabled: string;
/**
* @default 'ui dropdown'
*/
dropdown: string;
/**
* @default 'filtered'
*/
filtered: string;
/**
* @default 'hidden transition'
*/
hidden: string;
/**
* @default 'item'
*/
item: string;
/**
* @default 'ui label'
*/
label: string;
/**
* @default 'loading'
*/
loading: string;
/**
* @default 'menu'
*/
menu: string;
/**
* @default 'message'
*/
message: string;
/**
* @default 'multiple'
*/
multiple: string;
/**
* @default 'default'
*/
placeholder: string;
/**
* @default 'search'
*/
search: string;
/**
* @default 'selected'
*/
selected: string;
/**
* @default 'selection'
*/
selection: string;
/**
* @default 'upward'
*/
upward: string;
/**
* @default 'visible'
*/
visible: string;
}
}
interface ErrorSettings extends Pick<ErrorSettings._Impl, keyof ErrorSettings._Impl> { }
namespace ErrorSettings {
type Param = ErrorSettings | object;
interface _Impl {
/**
* @default 'You called a dropdown action that was not defined'
*/
action: string;
/**
* @default 'Once a select has been initialized behaviors must be called on the created ui dropdown'
*/
alreadySetup: string;
/**
* @default 'Allowing user additions currently requires the use of labels.'
*/
labels: string;
/**
* @default 'The method you called is not defined.'
*/
method: string;
/**
* @default 'This module requires ui transitions <https: github.com="" semantic-org="" ui-transition="">'
*/
noTransition: string;
}
}
}
}
+12
View File
@@ -0,0 +1,12 @@
// Type definitions for semantic-ui-dropdown 2.2
// Project: http://www.semantic-ui.com
// Definitions by: Leonard Thieu <https://github.com/leonard-thieu>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.2
/// <reference types="jquery" />
/// <reference types="semantic-ui-api" />
/// <reference path="global.d.ts" />
declare const dropdown: SemanticUI.Dropdown;
export = dropdown;
@@ -0,0 +1,208 @@
function test_dropdown_static() {
$.fn.dropdown.settings.error.method = 'method';
$.fn.dropdown.settings.namespace = 'namespace';
$.fn.dropdown.settings.name = 'name';
$.fn.dropdown.settings.silent = false;
$.fn.dropdown.settings.debug = true;
$.fn.dropdown.settings.performance = true;
$.fn.dropdown.settings.verbose = true;
}
function test_dropdown() {
const selector = '.ui.dropdown';
$(selector).dropdown('setup menu') === $();
$(selector).dropdown('refresh') === $();
$(selector).dropdown('toggle') === $();
$(selector).dropdown('show') === $();
$(selector).dropdown('hide') === $();
$(selector).dropdown('clear') === $();
$(selector).dropdown('hide others') === $();
$(selector).dropdown('restore defaults') === $();
$(selector).dropdown('restore default text') === $();
$(selector).dropdown('restore placeholder text') === $();
$(selector).dropdown('restore default value') === $();
$(selector).dropdown('save defaults') === $();
$(selector).dropdown('set selected', 123) === $();
$(selector).dropdown('remove selected', false) === $();
$(selector).dropdown('set selected', ['456']) === $();
$(selector).dropdown('set exactly', []) === $();
$(selector).dropdown('set text', 'hello') === $();
$(selector).dropdown('set value', 24) === $();
$(selector).dropdown('get text') === 'text';
$(selector).dropdown('get value') === {};
$(selector).dropdown('get item', 'Pennsylvania') === $();
$(selector).dropdown('bind touch events') === $();
$(selector).dropdown('bind mouse events') === $();
$(selector).dropdown('bind intent') === $();
$(selector).dropdown('unbind intent') === $();
$(selector).dropdown('determine intent') === true;
$(selector).dropdown('determine select action', 'text', 90) === $();
$(selector).dropdown('set active') === $();
$(selector).dropdown('set visible') === $();
$(selector).dropdown('remove active') === $();
$(selector).dropdown('remove visible') === $();
$(selector).dropdown('is selection') === false;
$(selector).dropdown('is animated') === false;
$(selector).dropdown('is visible') === false;
$(selector).dropdown('is hidden') === false;
$(selector).dropdown('get default text') === 'default text';
$(selector).dropdown('get placeholder text') === 'placeholder text';
$(selector).dropdown('destroy') === $();
$(selector).dropdown('setting', 'debug', undefined) === false;
$(selector).dropdown('setting', 'debug') === false;
$(selector).dropdown('setting', 'debug', true) === $();
$(selector).dropdown('setting', {
namespace: 'namespace',
name: 'name',
silent: false,
debug: true,
performance: true,
verbose: true
}) === $();
$(selector).dropdown({
on: 'hover',
allowReselection: true,
allowAdditions: false,
hideAdditions: true,
action(text, value, element) {
this === $();
text === 'text';
if (typeof value !== 'string') {
value === false;
}
element === $();
},
minCharacters: 2,
match: 'text',
selectOnKeydown: false,
forceSelection: true,
allowCategorySelection: false,
placeholder: 'value',
apiSettings: {
cache: 'local',
throttleFirstRequest: true,
loadingDuration: 20
},
fields: {
remoteValues: 'remoteValues',
values: 'values',
name: 'name',
value: 'value'
},
saveRemoteData: true,
filterRemoteData: false,
useLabels: true,
maxSelections: 20,
glyphWidth: 14,
label: {
transition: 'horizontal flip',
duration: 200,
variation: 'basic'
},
direction: 'downward',
keepOnScreen: false,
context: 'body',
fullTextSearch: 'exact',
preserveHTML: true,
sortSelect: false,
showOnFocus: true,
allowTab: false,
transition: 'auto',
duration: 500,
keys: {
backspace: 8,
delimiter: false,
deleteKey: 46,
enter: 13,
escape: 27,
pageUp: 33,
pageDown: 34,
leftArrow: 37,
upArrow: 38,
rightArrow: 30,
downArrow: 40
},
delay: {
hide: 300,
show: 200,
search: 50,
touch: 50
},
onChange(value, text, $choice) {
value === {};
text === 'text';
$choice === $();
},
onAdd(addedValue, addedText, $addedChoice) {
addedValue === {};
addedText === 'addedText';
$addedChoice === $();
},
message: {
addResult: 'addResult',
count: 'count',
maxSelections: 'maxSelections',
noResults: 'noResults',
},
selector: {
addition: 'addition',
dropdown: 'dropdown',
icon: 'icon',
input: 'input',
item: 'item',
label: 'label',
remove: 'remove',
siblingLabel: 'siblingLabel',
menu: 'menu',
message: 'message',
menuIcon: 'menuIcon',
search: 'search',
text: 'text',
},
regExp: {
escape: /[-[\]{}()*+?.,\\^$|#\s]/g
},
metadata: {
defaultText: 'defaultText',
defaultValue: 'defaultValue',
placeholderText: 'placeholderText',
text: 'text',
value: 'value',
},
className: {
active: 'active',
addition: 'addition',
animating: 'animating',
disabled: 'disabled',
dropdown: 'dropdown',
filtered: 'filtered',
hidden: 'hidden',
item: 'item',
label: 'label',
loading: 'loading',
menu: 'menu',
message: 'message',
multiple: 'multiple',
placeholder: 'placeholder',
search: 'search',
selected: 'selected',
selection: 'selection',
upward: 'upward',
visible: 'visible',
},
error: {
action: 'action',
alreadySetup: 'alreadySetup',
labels: 'labels',
method: 'method',
noTransition: 'noTransition'
}
}) === $();
$(selector).dropdown() === $();
}
import dropdown = require('semantic-ui-dropdown');
function test_module() {
$.fn.dropdown = dropdown;
}
+24
View File
@@ -0,0 +1,24 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"es6",
"dom"
],
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"global.d.ts",
"semantic-ui-dropdown-tests.ts"
]
}
+7
View File
@@ -0,0 +1,7 @@
{
"extends": "dtslint/dt.json",
"rules": {
"no-empty-interface": false,
"unified-signatures": false
}
}