Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
flask-admin
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Python-Dev
flask-admin
Commits
2b4bfe35
Commit
2b4bfe35
authored
Jan 10, 2015
by
Serge S. Koval
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #756 from pawl/list_editable
Add editable list view
parents
90db8a90
9ba43b5a
Changes
21
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
2053 additions
and
115 deletions
+2053
-115
view.py
flask_admin/contrib/mongoengine/view.py
+13
-0
view.py
flask_admin/contrib/peewee/view.py
+12
-0
view.py
flask_admin/contrib/sqla/view.py
+14
-1
base.py
flask_admin/model/base.py
+133
-33
fields.py
flask_admin/model/fields.py
+59
-1
form.py
flask_admin/model/form.py
+24
-0
widgets.py
flask_admin/model/widgets.py
+85
-0
form-1.0.0.js
flask_admin/static/admin/js/form-1.0.0.js
+38
-1
bootstrap2-editable-1.5.1.css
...tatic/vendor/x-editable/css/bootstrap2-editable-1.5.1.css
+663
-0
bootstrap3-editable-1.5.1.css
...tatic/vendor/x-editable/css/bootstrap3-editable-1.5.1.css
+663
-0
clear.png
flask_admin/static/vendor/x-editable/img/clear.png
+0
-0
loading.gif
flask_admin/static/vendor/x-editable/img/loading.gif
+0
-0
bootstrap2-editable-1.5.1.min.js
...tic/vendor/x-editable/js/bootstrap2-editable-1.5.1.min.js
+7
-0
bootstrap3-editable-1.5.1.min.js
...tic/vendor/x-editable/js/bootstrap3-editable-1.5.1.min.js
+7
-0
lib.html
flask_admin/templates/bootstrap2/admin/lib.html
+6
-0
list.html
flask_admin/templates/bootstrap2/admin/model/list.html
+12
-3
lib.html
flask_admin/templates/bootstrap3/admin/lib.html
+13
-7
list.html
flask_admin/templates/bootstrap3/admin/model/list.html
+11
-3
test_basic.py
flask_admin/tests/mongoengine/test_basic.py
+90
-13
test_basic.py
flask_admin/tests/peeweemodel/test_basic.py
+100
-22
test_basic.py
flask_admin/tests/sqla/test_basic.py
+103
-31
No files found.
flask_admin/contrib/mongoengine/view.py
View file @
2b4bfe35
...
...
@@ -5,6 +5,7 @@ from flask import request, flash, abort, Response
from
flask.ext.admin
import
expose
from
flask.ext.admin.babel
import
gettext
,
ngettext
,
lazy_gettext
from
flask.ext.admin.model
import
BaseModelView
from
flask.ext.admin.model.form
import
wrap_fields_in_fieldlist
from
flask.ext.admin._compat
import
iteritems
,
string_types
import
mongoengine
...
...
@@ -398,6 +399,18 @@ class ModelView(BaseModelView):
return
form_class
def
scaffold_list_form
(
self
):
"""
Create form for the `index_view` using only the columns from
`self.column_editable_list`.
"""
form_class
=
get_form
(
self
.
model
,
self
.
model_form_converter
(
self
),
base_class
=
self
.
form_base_class
,
only
=
self
.
column_editable_list
)
return
wrap_fields_in_fieldlist
(
self
.
form_base_class
,
form_class
)
# AJAX foreignkey support
def
_create_ajax_loader
(
self
,
name
,
opts
):
return
create_ajax_loader
(
self
.
model
,
name
,
name
,
opts
)
...
...
flask_admin/contrib/peewee/view.py
View file @
2b4bfe35
...
...
@@ -5,6 +5,7 @@ from flask import flash
from
flask.ext.admin._compat
import
string_types
from
flask.ext.admin.babel
import
gettext
,
ngettext
,
lazy_gettext
from
flask.ext.admin.model
import
BaseModelView
from
flask.ext.admin.model.form
import
wrap_fields_in_fieldlist
from
peewee
import
PrimaryKeyField
,
ForeignKeyField
,
Field
,
CharField
,
TextField
...
...
@@ -237,6 +238,17 @@ class ModelView(BaseModelView):
return
form_class
def
scaffold_list_form
(
self
):
"""
Create form for the `index_view` using only the columns from
`self.column_editable_list`.
"""
form_class
=
get_form
(
self
.
model
,
self
.
model_form_converter
(
self
),
base_class
=
self
.
form_base_class
,
only
=
self
.
column_editable_list
)
return
wrap_fields_in_fieldlist
(
self
.
form_base_class
,
form_class
)
def
scaffold_inline_form_models
(
self
,
form_class
):
converter
=
self
.
model_form_converter
(
self
)
inline_converter
=
self
.
inline_model_form_converter
(
self
)
...
...
flask_admin/contrib/sqla/view.py
View file @
2b4bfe35
...
...
@@ -11,6 +11,8 @@ from flask import flash
from
flask.ext.admin._compat
import
string_types
from
flask.ext.admin.babel
import
gettext
,
ngettext
,
lazy_gettext
from
flask.ext.admin.model
import
BaseModelView
from
flask.ext.admin.model.form
import
wrap_fields_in_fieldlist
from
flask.ext.admin.actions
import
action
from
flask.ext.admin._backwards
import
ObsoleteAttr
...
...
@@ -19,7 +21,6 @@ from .typefmt import DEFAULT_FORMATTERS
from
.tools
import
get_query_for_ids
from
.ajax
import
create_ajax_loader
# Set up logger
log
=
logging
.
getLogger
(
"flask-admin.sqla"
)
...
...
@@ -611,6 +612,18 @@ class ModelView(BaseModelView):
return
form_class
def
scaffold_list_form
(
self
):
"""
Create form for the `index_view` using only the columns from
`self.column_editable_list`.
"""
converter
=
self
.
model_form_converter
(
self
.
session
,
self
)
form_class
=
form
.
get_form
(
self
.
model
,
converter
,
base_class
=
self
.
form_base_class
,
only
=
self
.
column_editable_list
)
return
wrap_fields_in_fieldlist
(
self
.
form_base_class
,
form_class
)
def
scaffold_inline_form_models
(
self
,
form_class
):
"""
Contribute inline models to the form
...
...
flask_admin/model/base.py
View file @
2b4bfe35
import
warnings
import
re
from
flask
import
request
,
redirect
,
flash
,
abort
,
json
,
Response
from
flask
import
(
request
,
redirect
,
flash
,
abort
,
json
,
Response
,
get_flashed_messages
)
from
jinja2
import
contextfunction
from
wtforms.validators
import
ValidationError
...
...
@@ -11,7 +12,8 @@ from flask.ext.admin.base import BaseView, expose
from
flask.ext.admin.form
import
BaseForm
,
FormOpts
,
rules
from
flask.ext.admin.model
import
filters
,
typefmt
from
flask.ext.admin.actions
import
ActionsMixin
from
flask.ext.admin.helpers
import
get_form_data
,
validate_form_on_submit
,
get_redirect_target
from
flask.ext.admin.helpers
import
(
get_form_data
,
validate_form_on_submit
,
get_redirect_target
)
from
flask.ext.admin.tools
import
rec_getattr
from
flask.ext.admin._backwards
import
ObsoleteAttr
from
flask.ext.admin._compat
import
iteritems
,
OrderedDict
,
as_unicode
...
...
@@ -264,6 +266,16 @@ class BaseModelView(BaseView, ActionsMixin):
column_searchable_list = ('name', 'email')
"""
column_editable_list
=
None
"""
Collection of the columns which can be edited from the list view.
For example::
class MyModelView(BaseModelView):
column_editable_list = ('name', 'last_name')
"""
column_choices
=
None
"""
Map choices to columns in list view
...
...
@@ -580,6 +592,12 @@ class BaseModelView(BaseView, ActionsMixin):
self
.
_create_form_class
=
self
.
get_create_form
()
self
.
_edit_form_class
=
self
.
get_edit_form
()
# List View In-Line Editing
if
self
.
column_editable_list
:
self
.
_list_form_class
=
self
.
scaffold_list_form
()
else
:
self
.
column_editable_list
=
{}
def
_refresh_filters_cache
(
self
):
self
.
_filters
=
self
.
get_filters
()
...
...
@@ -833,6 +851,13 @@ class BaseModelView(BaseView, ActionsMixin):
"""
raise
NotImplementedError
(
'Please implement scaffold_form method'
)
def
scaffold_list_form
(
self
):
"""
Create form for the `index_view` using only the columns from
`self.column_editable_list`. Must be implemented in the child class.
"""
raise
NotImplementedError
(
'Please implement scaffold_list_form method'
)
def
get_form
(
self
):
"""
Get form class.
...
...
@@ -879,6 +904,14 @@ class BaseModelView(BaseView, ActionsMixin):
"""
return
self
.
_edit_form_class
(
get_form_data
(),
obj
=
obj
)
def
list_form
(
self
,
obj
=
None
):
"""
Instantiate model editing form for list view and return it.
Override to implement custom behavior.
"""
return
self
.
_list_form_class
(
get_form_data
(),
obj
=
obj
)
def
validate_form
(
self
,
form
):
"""
Validate the form on submit.
...
...
@@ -898,6 +931,15 @@ class BaseModelView(BaseView, ActionsMixin):
"""
return
name
in
self
.
_sortable_columns
def
is_editable
(
self
,
name
):
"""
Verify if column is editable.
:param name:
Column name.
"""
return
name
in
self
.
column_editable_list
def
_get_column_by_idx
(
self
,
idx
):
"""
Return column index by
...
...
@@ -1247,6 +1289,11 @@ class BaseModelView(BaseView, ActionsMixin):
"""
List view
"""
if
self
.
column_editable_list
:
form
=
self
.
list_form
()
else
:
form
=
None
# Grab parameters from URL
view_args
=
self
.
_get_list_extra_args
()
...
...
@@ -1289,37 +1336,47 @@ class BaseModelView(BaseView, ActionsMixin):
search
=
None
,
filters
=
None
))
return
self
.
render
(
self
.
list_template
,
data
=
data
,
# List
list_columns
=
self
.
_list_columns
,
sortable_columns
=
self
.
_sortable_columns
,
# Stuff
enumerate
=
enumerate
,
get_pk_value
=
self
.
get_pk_value
,
get_value
=
self
.
get_list_value
,
return_url
=
self
.
_get_list_url
(
view_args
),
# Pagination
count
=
count
,
pager_url
=
pager_url
,
num_pages
=
num_pages
,
page
=
view_args
.
page
,
# Sorting
sort_column
=
view_args
.
sort
,
sort_desc
=
view_args
.
sort_desc
,
sort_url
=
sort_url
,
# Search
search_supported
=
self
.
_search_supported
,
clear_search_url
=
clear_search_url
,
search
=
view_args
.
search
,
# Filters
filters
=
self
.
_filters
,
filter_groups
=
self
.
_filter_groups
,
active_filters
=
view_args
.
filters
,
# Actions
actions
=
actions
,
actions_confirmation
=
actions_confirmation
)
return
self
.
render
(
self
.
list_template
,
data
=
data
,
form
=
form
,
# List
list_columns
=
self
.
_list_columns
,
sortable_columns
=
self
.
_sortable_columns
,
editable_columns
=
self
.
column_editable_list
,
# Pagination
count
=
count
,
pager_url
=
pager_url
,
num_pages
=
num_pages
,
page
=
view_args
.
page
,
# Sorting
sort_column
=
view_args
.
sort
,
sort_desc
=
view_args
.
sort_desc
,
sort_url
=
sort_url
,
# Search
search_supported
=
self
.
_search_supported
,
clear_search_url
=
clear_search_url
,
search
=
view_args
.
search
,
# Filters
filters
=
self
.
_filters
,
filter_groups
=
self
.
_filter_groups
,
active_filters
=
view_args
.
filters
,
# Actions
actions
=
actions
,
actions_confirmation
=
actions_confirmation
,
# Misc
enumerate
=
enumerate
,
get_pk_value
=
self
.
get_pk_value
,
get_value
=
self
.
get_list_value
,
return_url
=
self
.
_get_list_url
(
view_args
),
)
@
expose
(
'/new/'
,
methods
=
(
'GET'
,
'POST'
))
def
create_view
(
self
):
...
...
@@ -1433,3 +1490,46 @@ class BaseModelView(BaseView, ActionsMixin):
data
=
[
loader
.
format
(
m
)
for
m
in
loader
.
get_list
(
query
,
offset
,
limit
)]
return
Response
(
json
.
dumps
(
data
),
mimetype
=
'application/json'
)
@
expose
(
'/ajax/update/'
,
methods
=
(
'POST'
,))
def
ajax_update
(
self
):
"""
Edits a single column of a record in list view.
"""
if
not
self
.
column_editable_list
:
abort
(
404
)
record
=
None
form
=
self
.
list_form
()
# prevent validation issues due to submitting a single field
# delete all fields except the field being submitted
for
field
in
form
:
# only the submitted field has a positive last_index
if
getattr
(
field
,
'last_index'
,
0
):
record
=
self
.
get_one
(
str
(
field
.
last_index
))
elif
field
.
name
==
'csrf_token'
:
pass
else
:
form
.
__delitem__
(
field
.
name
)
if
record
is
None
:
return
gettext
(
'Failed to update record.
%(error)
s'
,
error
=
''
),
500
if
self
.
validate_form
(
form
):
if
self
.
update_model
(
form
,
record
):
# Success
return
gettext
(
'Record was successfully saved.'
)
else
:
# Error: No records changed, or problem saving to database.
msgs
=
", "
.
join
([
msg
for
msg
in
get_flashed_messages
()])
return
gettext
(
'Failed to update record.
%(error)
s'
,
error
=
msgs
),
500
else
:
for
field
in
form
:
for
error
in
field
.
errors
:
# return validation error to x-editable
if
isinstance
(
error
,
list
):
return
", "
.
join
(
error
),
500
else
:
return
error
,
500
flask_admin/model/fields.py
View file @
2b4bfe35
...
...
@@ -3,8 +3,14 @@ import itertools
from
wtforms.validators
import
ValidationError
from
wtforms.fields
import
FieldList
,
FormField
,
SelectFieldBase
try
:
from
wtforms.fields
import
_unset_value
as
unset_value
except
ImportError
:
from
wtforms.utils
import
unset_value
from
flask.ext.admin._compat
import
iteritems
from
.widgets
import
InlineFieldListWidget
,
InlineFormWidget
,
AjaxSelect2Widget
from
.widgets
import
(
InlineFieldListWidget
,
InlineFormWidget
,
AjaxSelect2Widget
,
XEditableWidget
)
class
InlineFieldList
(
FieldList
):
...
...
@@ -120,6 +126,58 @@ class InlineModelFormField(FormField):
field
.
populate_obj
(
obj
,
name
)
class
ListEditableFieldList
(
FieldList
):
"""
Modified FieldList to allow for alphanumeric primary keys.
Used in the editable list view.
"""
widget
=
XEditableWidget
()
def
__init__
(
self
,
*
args
,
**
kwargs
):
super
(
ListEditableFieldList
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
# min_entries = 1 is required for the widget to determine the type
self
.
min_entries
=
1
def
_extract_indices
(
self
,
prefix
,
formdata
):
offset
=
len
(
prefix
)
+
1
for
k
in
formdata
:
if
k
.
startswith
(
prefix
):
k
=
k
[
offset
:]
.
split
(
'-'
,
1
)[
0
]
# removed "if k.isdigit():"
yield
k
def
_add_entry
(
self
,
formdata
=
None
,
data
=
unset_value
,
index
=
None
):
assert
not
self
.
max_entries
or
len
(
self
.
entries
)
<
self
.
max_entries
,
\
'You cannot have more than max_entries entries in this FieldList'
if
index
is
None
:
index
=
self
.
last_index
+
1
self
.
last_index
=
index
# '%s-%s' instead of '%s-%d' to allow alphanumeric
name
=
'
%
s-
%
s'
%
(
self
.
short_name
,
index
)
id
=
'
%
s-
%
s'
%
(
self
.
id
,
index
)
# support both wtforms 1 and 2
meta
=
getattr
(
self
,
'meta'
,
None
)
if
meta
:
field
=
self
.
unbound_field
.
bind
(
form
=
None
,
name
=
name
,
prefix
=
self
.
_prefix
,
id
=
id
,
_meta
=
meta
)
else
:
field
=
self
.
unbound_field
.
bind
(
form
=
None
,
name
=
name
,
prefix
=
self
.
_prefix
,
id
=
id
)
field
.
process
(
formdata
,
data
)
self
.
entries
.
append
(
field
)
return
field
def
populate_obj
(
self
,
obj
,
name
):
# return data from first item, instead of a list of items
setattr
(
obj
,
name
,
self
.
data
.
pop
())
class
AjaxSelectField
(
SelectFieldBase
):
"""
Ajax Model Select Field
...
...
flask_admin/model/form.py
View file @
2b4bfe35
...
...
@@ -3,6 +3,9 @@ import inspect
from
flask.ext.admin.form
import
BaseForm
,
rules
from
flask.ext.admin._compat
import
iteritems
from
.fields
import
ListEditableFieldList
from
wtforms.fields.core
import
UnboundField
def
converts
(
*
args
):
def
_inner
(
func
):
...
...
@@ -11,6 +14,27 @@ def converts(*args):
return
_inner
def
wrap_fields_in_fieldlist
(
form_base_class
,
form_class
):
"""
Create a form class with all the fields wrapped in a FieldList.
Wrapping each field in FieldList allows submitting POST requests
in this format: ('<field_name>-<primary_key>', '<value>')
Used in the editable list view.
"""
class
FieldListForm
(
form_base_class
):
pass
# iterate FormMeta to get unbound fields
for
name
,
obj
in
iteritems
(
form_class
.
__dict__
):
if
isinstance
(
obj
,
UnboundField
):
# wrap field in a WTForms FieldList
setattr
(
FieldListForm
,
name
,
ListEditableFieldList
(
obj
))
return
FieldListForm
class
InlineBaseFormAdmin
(
object
):
"""
Settings for inline form administration.
...
...
flask_admin/model/widgets.py
View file @
2b4bfe35
...
...
@@ -61,3 +61,88 @@ class AjaxSelect2Widget(object):
kwargs
.
setdefault
(
'data-placeholder'
,
placeholder
)
return
HTMLString
(
'<input
%
s>'
%
html_params
(
name
=
field
.
name
,
**
kwargs
))
class
XEditableWidget
(
object
):
"""
WTForms widget that provides in-line editing for the list view.
Determines how to display the x-editable/ajax form based on the
field inside of the FieldList (StringField, IntegerField, etc).
"""
def
__call__
(
self
,
field
,
**
kwargs
):
value
=
kwargs
.
pop
(
"value"
,
""
)
kwargs
.
setdefault
(
'data-role'
,
'x-editable'
)
kwargs
.
setdefault
(
'data-url'
,
'./ajax/update/'
)
kwargs
.
setdefault
(
'id'
,
field
.
id
)
kwargs
.
setdefault
(
'name'
,
field
.
name
)
kwargs
.
setdefault
(
'href'
,
'#'
)
if
not
kwargs
.
get
(
'pk'
):
raise
Exception
(
'pk required'
)
kwargs
[
'data-pk'
]
=
str
(
kwargs
.
pop
(
"pk"
))
kwargs
[
'data-csrf'
]
=
kwargs
.
pop
(
"csrf"
,
""
)
# subfield is the first entry (subfield) from FieldList (field)
subfield
=
field
.
entries
[
0
]
kwargs
=
self
.
get_kwargs
(
subfield
,
kwargs
)
return
HTMLString
(
'<a
%
s>
%
s</a>'
%
(
html_params
(
**
kwargs
),
value
)
)
def
get_kwargs
(
self
,
subfield
,
kwargs
):
"""
Return extra kwargs based on the subfield type.
"""
if
subfield
.
type
==
'StringField'
:
kwargs
[
'data-type'
]
=
'text'
elif
subfield
.
type
==
'TextAreaField'
:
kwargs
[
'data-type'
]
=
'textarea'
kwargs
[
'data-rows'
]
=
'5'
elif
subfield
.
type
==
'BooleanField'
:
kwargs
[
'data-type'
]
=
'select'
# data-source = dropdown options
kwargs
[
'data-source'
]
=
{
''
:
'False'
,
'1'
:
'True'
}
kwargs
[
'data-role'
]
=
'x-editable-boolean'
elif
subfield
.
type
==
'Select2Field'
:
kwargs
[
'data-type'
]
=
'select'
kwargs
[
'data-source'
]
=
dict
(
subfield
.
choices
)
elif
subfield
.
type
==
'DateField'
:
kwargs
[
'data-type'
]
=
'combodate'
kwargs
[
'data-format'
]
=
'YYYY-MM-DD'
kwargs
[
'data-template'
]
=
'YYYY-MM-DD'
elif
subfield
.
type
==
'DateTimeField'
:
kwargs
[
'data-type'
]
=
'combodate'
kwargs
[
'data-format'
]
=
'YYYY-MM-DD HH:mm:ss'
kwargs
[
'data-template'
]
=
'YYYY-MM-DD HH:mm:ss'
# x-editable-combodate uses 1 minute increments
kwargs
[
'data-role'
]
=
'x-editable-combodate'
elif
subfield
.
type
==
'TimeField'
:
kwargs
[
'data-type'
]
=
'combodate'
kwargs
[
'data-format'
]
=
'HH:mm:ss'
kwargs
[
'data-template'
]
=
'HH:mm:ss'
kwargs
[
'data-role'
]
=
'x-editable-combodate'
elif
subfield
.
type
==
'IntegerField'
:
kwargs
[
'data-type'
]
=
'number'
elif
subfield
.
type
in
[
'FloatField'
,
'DecimalField'
]:
kwargs
[
'data-type'
]
=
'number'
kwargs
[
'data-step'
]
=
'any'
elif
subfield
.
type
in
[
'QuerySelectField'
,
'ModelSelectField'
]:
kwargs
[
'data-type'
]
=
'select'
choices
=
{}
for
choice
in
subfield
:
try
:
choices
[
str
(
choice
.
_value
())]
=
str
(
choice
.
label
.
text
)
except
TypeError
:
choices
[
str
(
choice
.
_value
())]
=
""
kwargs
[
'data-source'
]
=
choices
else
:
raise
Exception
(
'Unsupported field type:
%
s'
%
(
type
(
subfield
),))
return
kwargs
flask_admin/static/admin/js/form-1.0.0.js
View file @
2b4bfe35
...
...
@@ -241,6 +241,17 @@
return
true
;
}
// make x-editable's POST act like a normal FieldList field
// for x-editable, x-editable-combodate, and x-editable-boolean cases
var
overrideXeditableParams
=
function
(
params
)
{
var
newParams
=
{};
newParams
[
params
.
name
+
'-'
+
params
.
pk
]
=
params
.
value
;
if
(
$
(
this
).
data
(
'csrf'
))
{
newParams
[
'csrf_token'
]
=
$
(
this
).
data
(
'csrf'
);
}
return
newParams
;
}
switch
(
name
)
{
case
'select2'
:
var
opts
=
{
...
...
@@ -390,6 +401,32 @@
case
'leaflet'
:
processLeafletWidget
(
$el
,
name
);
return
true
;
case
'x-editable'
:
$el
.
editable
({
params
:
overrideXeditableParams
});
return
true
;
case
'x-editable-combodate'
:
$el
.
editable
({
params
:
overrideXeditableParams
,
combodate
:
{
// prevent minutes from showing in 5 minute increments
minuteStep
:
1
}
});
return
true
;
case
'x-editable-boolean'
:
$el
.
editable
({
params
:
overrideXeditableParams
,
display
:
function
(
value
,
sourceData
,
response
)
{
// display new boolean value as an icon
if
(
response
)
{
if
(
value
==
'1'
)
{
$
(
this
).
html
(
'<span class="glyphicon glyphicon-ok-circle icon-ok-circle"></span>'
);
}
else
{
$
(
this
).
html
(
'<span class="glyphicon glyphicon-minus-sign icon-minus-sign"></span>'
);
}
}
}
});
}
};
...
...
@@ -463,7 +500,7 @@
this
.
applyGlobalStyles
=
function
(
parent
)
{
var
self
=
this
;
$
(
':input[data-role]'
,
parent
).
each
(
function
()
{
$
(
':input[data-role]
, a[data-role]
'
,
parent
).
each
(
function
()
{
var
$el
=
$
(
this
);
self
.
applyStyle
(
$el
,
$el
.
attr
(
'data-role'
));
});
...
...
flask_admin/static/vendor/x-editable/css/bootstrap2-editable-1.5.1.css
0 → 100644
View file @
2b4bfe35
/*! X-editable - v1.5.1
* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
* http://github.com/vitalets/x-editable
* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */
.editableform
{
margin-bottom
:
0
;
/* overwrites bootstrap margin */
}
.editableform
.control-group
{
margin-bottom
:
0
;
/* overwrites bootstrap margin */
white-space
:
nowrap
;
/* prevent wrapping buttons on new line */
line-height
:
20px
;
/* overwriting bootstrap line-height. See #133 */
}
/*
BS3 width:1005 for inputs breaks editable form in popup
See: https://github.com/vitalets/x-editable/issues/393
*/
.editableform
.form-control
{
width
:
auto
;
}
.editable-buttons
{
display
:
inline-block
;
/* should be inline to take effect of parent's white-space: nowrap */
vertical-align
:
top
;
margin-left
:
7px
;
/* inline-block emulation for IE7*/
zoom
:
1
;
*
display
:
inline
;
}
.editable-buttons.editable-buttons-bottom
{
display
:
block
;
margin-top
:
7px
;
margin-left
:
0
;
}
.editable-input
{
vertical-align
:
top
;
display
:
inline-block
;
/* should be inline to take effect of parent's white-space: nowrap */
width
:
auto
;
/* bootstrap-responsive has width: 100% that breakes layout */
white-space
:
normal
;
/* reset white-space decalred in parent*/
/* display-inline emulation for IE7*/
zoom
:
1
;
*
display
:
inline
;
}
.editable-buttons
.editable-cancel
{
margin-left
:
7px
;
}
/*for jquery-ui buttons need set height to look more pretty*/
.editable-buttons
button
.ui-button-icon-only
{
height
:
24px
;
width
:
30px
;
}
.editableform-loading
{
background
:
url('../img/loading.gif')
center
center
no-repeat
;
height
:
25px
;
width
:
auto
;
min-width
:
25px
;
}
.editable-inline
.editableform-loading
{
background-position
:
left
5px
;
}
.editable-error-block
{
max-width
:
300px
;
margin
:
5px
0
0
0
;
width
:
auto
;
white-space
:
normal
;
}
/*add padding for jquery ui*/
.editable-error-block.ui-state-error
{
padding
:
3px
;
}
.editable-error
{
color
:
red
;
}
/* ---- For specific types ---- */
.editableform
.editable-date
{
padding
:
0
;
margin
:
0
;
float
:
left
;
}
/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */
.editable-inline
.add-on
.icon-th
{
margin-top
:
3px
;
margin-left
:
1px
;
}
/* checklist vertical alignment */
.editable-checklist
label
input
[
type
=
"checkbox"
],
.editable-checklist
label
span
{
vertical-align
:
middle
;
margin
:
0
;
}
.editable-checklist
label
{
white-space
:
nowrap
;
}
/* set exact width of textarea to fit buttons toolbar */
.editable-wysihtml5
{
width
:
566px
;
height
:
250px
;
}
/* clear button shown as link in date inputs */
.editable-clear
{
clear
:
both
;
font-size
:
0.9em
;
text-decoration
:
none
;
text-align
:
right
;
}
/* IOS-style clear button for text inputs */
.editable-clear-x
{
background
:
url('../img/clear.png')
center
center
no-repeat
;
display
:
block
;
width
:
13px
;
height
:
13px
;
position
:
absolute
;
opacity
:
0.6
;
z-index
:
100
;
top
:
50%
;
right
:
6px
;
margin-top
:
-6px
;
}
.editable-clear-x
:hover
{
opacity
:
1
;
}
.editable-pre-wrapped
{
white-space
:
pre-wrap
;
}
.editable-container.editable-popup
{
max-width
:
none
!important
;
/* without this rule poshytip/tooltip does not stretch */
}
.editable-container.popover
{
width
:
auto
;
/* without this rule popover does not stretch */
}
.editable-container.editable-inline
{
display
:
inline-block
;
vertical-align
:
middle
;
width
:
auto
;
/* inline-block emulation for IE7*/
zoom
:
1
;
*
display
:
inline
;
}
.editable-container.ui-widget
{
font-size
:
inherit
;
/* jqueryui widget font 1.1em too big, overwrite it */
z-index
:
9990
;
/* should be less than select2 dropdown z-index to close dropdown first when click */
}
.editable-click
,
a
.editable-click
,
a
.editable-click
:hover
{
text-decoration
:
none
;
border-bottom
:
dashed
1px
#0088cc
;
}
.editable-click.editable-disabled
,
a
.editable-click.editable-disabled
,
a
.editable-click.editable-disabled
:hover
{
color
:
#585858
;
cursor
:
default
;
border-bottom
:
none
;
}
.editable-empty
,
.editable-empty
:hover
,
.editable-empty
:focus
{
font-style
:
italic
;
color
:
#DD1144
;
/* border-bottom: none; */
text-decoration
:
none
;
}
.editable-unsaved
{
font-weight
:
bold
;
}
.editable-unsaved
:after
{
/* content: '*'*/
}
.editable-bg-transition
{
-webkit-transition
:
background-color
1400ms
ease-out
;
-moz-transition
:
background-color
1400ms
ease-out
;
-o-transition
:
background-color
1400ms
ease-out
;
-ms-transition
:
background-color
1400ms
ease-out
;
transition
:
background-color
1400ms
ease-out
;
}
/*see https://github.com/vitalets/x-editable/issues/139 */
.form-horizontal
.editable
{
padding-top
:
5px
;
display
:
inline-block
;
}
/*!
* Datepicker for Bootstrap
*
* Copyright 2012 Stefan Petre
* Improvements by Andrew Rowls
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
*/
.datepicker
{
padding
:
4px
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
direction
:
ltr
;
/*.dow {
border-top: 1px solid #ddd !important;
}*/
}
.datepicker-inline
{
width
:
220px
;
}
.datepicker.datepicker-rtl
{
direction
:
rtl
;
}
.datepicker.datepicker-rtl
table
tr
td
span
{
float
:
right
;
}
.datepicker-dropdown
{
top
:
0
;
left
:
0
;
}
.datepicker-dropdown
:before
{
content
:
''
;
display
:
inline-block
;
border-left
:
7px
solid
transparent
;
border-right
:
7px
solid
transparent
;
border-bottom
:
7px
solid
#ccc
;
border-bottom-color
:
rgba
(
0
,
0
,
0
,
0.2
);
position
:
absolute
;
top
:
-7px
;
left
:
6px
;
}
.datepicker-dropdown
:after
{
content
:
''
;
display
:
inline-block
;
border-left
:
6px
solid
transparent
;
border-right
:
6px
solid
transparent
;
border-bottom
:
6px
solid
#ffffff
;
position
:
absolute
;
top
:
-6px
;
left
:
7px
;
}
.datepicker
>
div
{
display
:
none
;
}
.datepicker.days
div
.datepicker-days
{
display
:
block
;
}
.datepicker.months
div
.datepicker-months
{
display
:
block
;
}
.datepicker.years
div
.datepicker-years
{
display
:
block
;
}
.datepicker
table
{
margin
:
0
;
}
.datepicker
td
,
.datepicker
th
{
text-align
:
center
;
width
:
20px
;
height
:
20px
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
border
:
none
;
}
.table-striped
.datepicker
table
tr
td
,
.table-striped
.datepicker
table
tr
th
{
background-color
:
transparent
;
}
.datepicker
table
tr
td
.day
:hover
{
background
:
#eeeeee
;
cursor
:
pointer
;
}
.datepicker
table
tr
td
.old
,
.datepicker
table
tr
td
.new
{
color
:
#999999
;
}
.datepicker
table
tr
td
.disabled
,
.datepicker
table
tr
td
.disabled
:hover
{
background
:
none
;
color
:
#999999
;
cursor
:
default
;
}
.datepicker
table
tr
td
.today
,
.datepicker
table
tr
td
.today
:hover
,
.datepicker
table
tr
td
.today.disabled
,
.datepicker
table
tr
td
.today.disabled
:hover
{
background-color
:
#fde19a
;
background-image
:
-moz-linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-image
:
-ms-linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#fdd49a
),
to
(
#fdf59a
));
background-image
:
-webkit-linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-image
:
-o-linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-image
:
linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#fdd49a'
,
endColorstr
=
'#fdf59a'
,
GradientType
=
0
);
border-color
:
#fdf59a
#fdf59a
#fbed50
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
color
:
#000
;
}
.datepicker
table
tr
td
.today
:hover
,
.datepicker
table
tr
td
.today
:hover:hover
,
.datepicker
table
tr
td
.today.disabled
:hover
,
.datepicker
table
tr
td
.today.disabled
:hover:hover
,
.datepicker
table
tr
td
.today
:active
,
.datepicker
table
tr
td
.today
:hover:active
,
.datepicker
table
tr
td
.today.disabled
:active
,
.datepicker
table
tr
td
.today.disabled
:hover:active
,
.datepicker
table
tr
td
.today.active
,
.datepicker
table
tr
td
.today
:hover
.active
,
.datepicker
table
tr
td
.today.disabled.active
,
.datepicker
table
tr
td
.today.disabled
:hover
.active
,
.datepicker
table
tr
td
.today.disabled
,
.datepicker
table
tr
td
.today
:hover
.disabled
,
.datepicker
table
tr
td
.today.disabled.disabled
,
.datepicker
table
tr
td
.today.disabled
:hover
.disabled
,
.datepicker
table
tr
td
.today
[
disabled
],
.datepicker
table
tr
td
.today
:hover
[
disabled
],
.datepicker
table
tr
td
.today.disabled
[
disabled
],
.datepicker
table
tr
td
.today.disabled
:hover
[
disabled
]
{
background-color
:
#fdf59a
;
}
.datepicker
table
tr
td
.today
:active
,
.datepicker
table
tr
td
.today
:hover:active
,
.datepicker
table
tr
td
.today.disabled
:active
,
.datepicker
table
tr
td
.today.disabled
:hover:active
,
.datepicker
table
tr
td
.today.active
,
.datepicker
table
tr
td
.today
:hover
.active
,
.datepicker
table
tr
td
.today.disabled.active
,
.datepicker
table
tr
td
.today.disabled
:hover
.active
{
background-color
:
#fbf069
\
9
;
}
.datepicker
table
tr
td
.today
:hover:hover
{
color
:
#000
;
}
.datepicker
table
tr
td
.today.active
:hover
{
color
:
#fff
;
}
.datepicker
table
tr
td
.range
,
.datepicker
table
tr
td
.range
:hover
,
.datepicker
table
tr
td
.range.disabled
,
.datepicker
table
tr
td
.range.disabled
:hover
{
background
:
#eeeeee
;
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
;
}
.datepicker
table
tr
td
.range.today
,
.datepicker
table
tr
td
.range.today
:hover
,
.datepicker
table
tr
td
.range.today.disabled
,
.datepicker
table
tr
td
.range.today.disabled
:hover
{
background-color
:
#f3d17a
;
background-image
:
-moz-linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-image
:
-ms-linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#f3c17a
),
to
(
#f3e97a
));
background-image
:
-webkit-linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-image
:
-o-linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-image
:
linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#f3c17a'
,
endColorstr
=
'#f3e97a'
,
GradientType
=
0
);
border-color
:
#f3e97a
#f3e97a
#edde34
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
;
}
.datepicker
table
tr
td
.range.today
:hover
,
.datepicker
table
tr
td
.range.today
:hover:hover
,
.datepicker
table
tr
td
.range.today.disabled
:hover
,
.datepicker
table
tr
td
.range.today.disabled
:hover:hover
,
.datepicker
table
tr
td
.range.today
:active
,
.datepicker
table
tr
td
.range.today
:hover:active
,
.datepicker
table
tr
td
.range.today.disabled
:active
,
.datepicker
table
tr
td
.range.today.disabled
:hover:active
,
.datepicker
table
tr
td
.range.today.active
,
.datepicker
table
tr
td
.range.today
:hover
.active
,
.datepicker
table
tr
td
.range.today.disabled.active
,
.datepicker
table
tr
td
.range.today.disabled
:hover
.active
,
.datepicker
table
tr
td
.range.today.disabled
,
.datepicker
table
tr
td
.range.today
:hover
.disabled
,
.datepicker
table
tr
td
.range.today.disabled.disabled
,
.datepicker
table
tr
td
.range.today.disabled
:hover
.disabled
,
.datepicker
table
tr
td
.range.today
[
disabled
],
.datepicker
table
tr
td
.range.today
:hover
[
disabled
],
.datepicker
table
tr
td
.range.today.disabled
[
disabled
],
.datepicker
table
tr
td
.range.today.disabled
:hover
[
disabled
]
{
background-color
:
#f3e97a
;
}
.datepicker
table
tr
td
.range.today
:active
,
.datepicker
table
tr
td
.range.today
:hover:active
,
.datepicker
table
tr
td
.range.today.disabled
:active
,
.datepicker
table
tr
td
.range.today.disabled
:hover:active
,
.datepicker
table
tr
td
.range.today.active
,
.datepicker
table
tr
td
.range.today
:hover
.active
,
.datepicker
table
tr
td
.range.today.disabled.active
,
.datepicker
table
tr
td
.range.today.disabled
:hover
.active
{
background-color
:
#efe24b
\
9
;
}
.datepicker
table
tr
td
.selected
,
.datepicker
table
tr
td
.selected
:hover
,
.datepicker
table
tr
td
.selected.disabled
,
.datepicker
table
tr
td
.selected.disabled
:hover
{
background-color
:
#9e9e9e
;
background-image
:
-moz-linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-image
:
-ms-linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#b3b3b3
),
to
(
#808080
));
background-image
:
-webkit-linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-image
:
-o-linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-image
:
linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#b3b3b3'
,
endColorstr
=
'#808080'
,
GradientType
=
0
);
border-color
:
#808080
#808080
#595959
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
color
:
#fff
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
);
}
.datepicker
table
tr
td
.selected
:hover
,
.datepicker
table
tr
td
.selected
:hover:hover
,
.datepicker
table
tr
td
.selected.disabled
:hover
,
.datepicker
table
tr
td
.selected.disabled
:hover:hover
,
.datepicker
table
tr
td
.selected
:active
,
.datepicker
table
tr
td
.selected
:hover:active
,
.datepicker
table
tr
td
.selected.disabled
:active
,
.datepicker
table
tr
td
.selected.disabled
:hover:active
,
.datepicker
table
tr
td
.selected.active
,
.datepicker
table
tr
td
.selected
:hover
.active
,
.datepicker
table
tr
td
.selected.disabled.active
,
.datepicker
table
tr
td
.selected.disabled
:hover
.active
,
.datepicker
table
tr
td
.selected.disabled
,
.datepicker
table
tr
td
.selected
:hover
.disabled
,
.datepicker
table
tr
td
.selected.disabled.disabled
,
.datepicker
table
tr
td
.selected.disabled
:hover
.disabled
,
.datepicker
table
tr
td
.selected
[
disabled
],
.datepicker
table
tr
td
.selected
:hover
[
disabled
],
.datepicker
table
tr
td
.selected.disabled
[
disabled
],
.datepicker
table
tr
td
.selected.disabled
:hover
[
disabled
]
{
background-color
:
#808080
;
}
.datepicker
table
tr
td
.selected
:active
,
.datepicker
table
tr
td
.selected
:hover:active
,
.datepicker
table
tr
td
.selected.disabled
:active
,
.datepicker
table
tr
td
.selected.disabled
:hover:active
,
.datepicker
table
tr
td
.selected.active
,
.datepicker
table
tr
td
.selected
:hover
.active
,
.datepicker
table
tr
td
.selected.disabled.active
,
.datepicker
table
tr
td
.selected.disabled
:hover
.active
{
background-color
:
#666666
\
9
;
}
.datepicker
table
tr
td
.active
,
.datepicker
table
tr
td
.active
:hover
,
.datepicker
table
tr
td
.active.disabled
,
.datepicker
table
tr
td
.active.disabled
:hover
{
background-color
:
#006dcc
;
background-image
:
-moz-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-ms-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#0088cc
),
to
(
#0044cc
));
background-image
:
-webkit-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-o-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#0088cc'
,
endColorstr
=
'#0044cc'
,
GradientType
=
0
);
border-color
:
#0044cc
#0044cc
#002a80
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
color
:
#fff
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
);
}
.datepicker
table
tr
td
.active
:hover
,
.datepicker
table
tr
td
.active
:hover:hover
,
.datepicker
table
tr
td
.active.disabled
:hover
,
.datepicker
table
tr
td
.active.disabled
:hover:hover
,
.datepicker
table
tr
td
.active
:active
,
.datepicker
table
tr
td
.active
:hover:active
,
.datepicker
table
tr
td
.active.disabled
:active
,
.datepicker
table
tr
td
.active.disabled
:hover:active
,
.datepicker
table
tr
td
.active.active
,
.datepicker
table
tr
td
.active
:hover
.active
,
.datepicker
table
tr
td
.active.disabled.active
,
.datepicker
table
tr
td
.active.disabled
:hover
.active
,
.datepicker
table
tr
td
.active.disabled
,
.datepicker
table
tr
td
.active
:hover
.disabled
,
.datepicker
table
tr
td
.active.disabled.disabled
,
.datepicker
table
tr
td
.active.disabled
:hover
.disabled
,
.datepicker
table
tr
td
.active
[
disabled
],
.datepicker
table
tr
td
.active
:hover
[
disabled
],
.datepicker
table
tr
td
.active.disabled
[
disabled
],
.datepicker
table
tr
td
.active.disabled
:hover
[
disabled
]
{
background-color
:
#0044cc
;
}
.datepicker
table
tr
td
.active
:active
,
.datepicker
table
tr
td
.active
:hover:active
,
.datepicker
table
tr
td
.active.disabled
:active
,
.datepicker
table
tr
td
.active.disabled
:hover:active
,
.datepicker
table
tr
td
.active.active
,
.datepicker
table
tr
td
.active
:hover
.active
,
.datepicker
table
tr
td
.active.disabled.active
,
.datepicker
table
tr
td
.active.disabled
:hover
.active
{
background-color
:
#003399
\
9
;
}
.datepicker
table
tr
td
span
{
display
:
block
;
width
:
23%
;
height
:
54px
;
line-height
:
54px
;
float
:
left
;
margin
:
1%
;
cursor
:
pointer
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
}
.datepicker
table
tr
td
span
:hover
{
background
:
#eeeeee
;
}
.datepicker
table
tr
td
span
.disabled
,
.datepicker
table
tr
td
span
.disabled
:hover
{
background
:
none
;
color
:
#999999
;
cursor
:
default
;
}
.datepicker
table
tr
td
span
.active
,
.datepicker
table
tr
td
span
.active
:hover
,
.datepicker
table
tr
td
span
.active.disabled
,
.datepicker
table
tr
td
span
.active.disabled
:hover
{
background-color
:
#006dcc
;
background-image
:
-moz-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-ms-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#0088cc
),
to
(
#0044cc
));
background-image
:
-webkit-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-o-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#0088cc'
,
endColorstr
=
'#0044cc'
,
GradientType
=
0
);
border-color
:
#0044cc
#0044cc
#002a80
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
color
:
#fff
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
);
}
.datepicker
table
tr
td
span
.active
:hover
,
.datepicker
table
tr
td
span
.active
:hover:hover
,
.datepicker
table
tr
td
span
.active.disabled
:hover
,
.datepicker
table
tr
td
span
.active.disabled
:hover:hover
,
.datepicker
table
tr
td
span
.active
:active
,
.datepicker
table
tr
td
span
.active
:hover:active
,
.datepicker
table
tr
td
span
.active.disabled
:active
,
.datepicker
table
tr
td
span
.active.disabled
:hover:active
,
.datepicker
table
tr
td
span
.active.active
,
.datepicker
table
tr
td
span
.active
:hover
.active
,
.datepicker
table
tr
td
span
.active.disabled.active
,
.datepicker
table
tr
td
span
.active.disabled
:hover
.active
,
.datepicker
table
tr
td
span
.active.disabled
,
.datepicker
table
tr
td
span
.active
:hover
.disabled
,
.datepicker
table
tr
td
span
.active.disabled.disabled
,
.datepicker
table
tr
td
span
.active.disabled
:hover
.disabled
,
.datepicker
table
tr
td
span
.active
[
disabled
],
.datepicker
table
tr
td
span
.active
:hover
[
disabled
],
.datepicker
table
tr
td
span
.active.disabled
[
disabled
],
.datepicker
table
tr
td
span
.active.disabled
:hover
[
disabled
]
{
background-color
:
#0044cc
;
}
.datepicker
table
tr
td
span
.active
:active
,
.datepicker
table
tr
td
span
.active
:hover:active
,
.datepicker
table
tr
td
span
.active.disabled
:active
,
.datepicker
table
tr
td
span
.active.disabled
:hover:active
,
.datepicker
table
tr
td
span
.active.active
,
.datepicker
table
tr
td
span
.active
:hover
.active
,
.datepicker
table
tr
td
span
.active.disabled.active
,
.datepicker
table
tr
td
span
.active.disabled
:hover
.active
{
background-color
:
#003399
\
9
;
}
.datepicker
table
tr
td
span
.old
,
.datepicker
table
tr
td
span
.new
{
color
:
#999999
;
}
.datepicker
th
.datepicker-switch
{
width
:
145px
;
}
.datepicker
thead
tr
:first-child
th
,
.datepicker
tfoot
tr
th
{
cursor
:
pointer
;
}
.datepicker
thead
tr
:first-child
th
:hover
,
.datepicker
tfoot
tr
th
:hover
{
background
:
#eeeeee
;
}
.datepicker
.cw
{
font-size
:
10px
;
width
:
12px
;
padding
:
0
2px
0
5px
;
vertical-align
:
middle
;
}
.datepicker
thead
tr
:first-child
th
.cw
{
cursor
:
default
;
background-color
:
transparent
;
}
.input-append.date
.add-on
i
,
.input-prepend.date
.add-on
i
{
display
:
block
;
cursor
:
pointer
;
width
:
16px
;
height
:
16px
;
}
.input-daterange
input
{
text-align
:
center
;
}
.input-daterange
input
:first-child
{
-webkit-border-radius
:
3px
0
0
3px
;
-moz-border-radius
:
3px
0
0
3px
;
border-radius
:
3px
0
0
3px
;
}
.input-daterange
input
:last-child
{
-webkit-border-radius
:
0
3px
3px
0
;
-moz-border-radius
:
0
3px
3px
0
;
border-radius
:
0
3px
3px
0
;
}
.input-daterange
.add-on
{
display
:
inline-block
;
width
:
auto
;
min-width
:
16px
;
height
:
18px
;
padding
:
4px
5px
;
font-weight
:
normal
;
line-height
:
18px
;
text-align
:
center
;
text-shadow
:
0
1px
0
#ffffff
;
vertical-align
:
middle
;
background-color
:
#eeeeee
;
border
:
1px
solid
#ccc
;
margin-left
:
-5px
;
margin-right
:
-5px
;
}
flask_admin/static/vendor/x-editable/css/bootstrap3-editable-1.5.1.css
0 → 100644
View file @
2b4bfe35
/*! X-editable - v1.5.1
* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
* http://github.com/vitalets/x-editable
* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */
.editableform
{
margin-bottom
:
0
;
/* overwrites bootstrap margin */
}
.editableform
.control-group
{
margin-bottom
:
0
;
/* overwrites bootstrap margin */
white-space
:
nowrap
;
/* prevent wrapping buttons on new line */
line-height
:
20px
;
/* overwriting bootstrap line-height. See #133 */
}
/*
BS3 width:1005 for inputs breaks editable form in popup
See: https://github.com/vitalets/x-editable/issues/393
*/
.editableform
.form-control
{
width
:
auto
;
}
.editable-buttons
{
display
:
inline-block
;
/* should be inline to take effect of parent's white-space: nowrap */
vertical-align
:
top
;
margin-left
:
7px
;
/* inline-block emulation for IE7*/
zoom
:
1
;
*
display
:
inline
;
}
.editable-buttons.editable-buttons-bottom
{
display
:
block
;
margin-top
:
7px
;
margin-left
:
0
;
}
.editable-input
{
vertical-align
:
top
;
display
:
inline-block
;
/* should be inline to take effect of parent's white-space: nowrap */
width
:
auto
;
/* bootstrap-responsive has width: 100% that breakes layout */
white-space
:
normal
;
/* reset white-space decalred in parent*/
/* display-inline emulation for IE7*/
zoom
:
1
;
*
display
:
inline
;
}
.editable-buttons
.editable-cancel
{
margin-left
:
7px
;
}
/*for jquery-ui buttons need set height to look more pretty*/
.editable-buttons
button
.ui-button-icon-only
{
height
:
24px
;
width
:
30px
;
}
.editableform-loading
{
background
:
url('../img/loading.gif')
center
center
no-repeat
;
height
:
25px
;
width
:
auto
;
min-width
:
25px
;
}
.editable-inline
.editableform-loading
{
background-position
:
left
5px
;
}
.editable-error-block
{
max-width
:
300px
;
margin
:
5px
0
0
0
;
width
:
auto
;
white-space
:
normal
;
}
/*add padding for jquery ui*/
.editable-error-block.ui-state-error
{
padding
:
3px
;
}
.editable-error
{
color
:
red
;
}
/* ---- For specific types ---- */
.editableform
.editable-date
{
padding
:
0
;
margin
:
0
;
float
:
left
;
}
/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */
.editable-inline
.add-on
.icon-th
{
margin-top
:
3px
;
margin-left
:
1px
;
}
/* checklist vertical alignment */
.editable-checklist
label
input
[
type
=
"checkbox"
],
.editable-checklist
label
span
{
vertical-align
:
middle
;
margin
:
0
;
}
.editable-checklist
label
{
white-space
:
nowrap
;
}
/* set exact width of textarea to fit buttons toolbar */
.editable-wysihtml5
{
width
:
566px
;
height
:
250px
;
}
/* clear button shown as link in date inputs */
.editable-clear
{
clear
:
both
;
font-size
:
0.9em
;
text-decoration
:
none
;
text-align
:
right
;
}
/* IOS-style clear button for text inputs */
.editable-clear-x
{
background
:
url('../img/clear.png')
center
center
no-repeat
;
display
:
block
;
width
:
13px
;
height
:
13px
;
position
:
absolute
;
opacity
:
0.6
;
z-index
:
100
;
top
:
50%
;
right
:
6px
;
margin-top
:
-6px
;
}
.editable-clear-x
:hover
{
opacity
:
1
;
}
.editable-pre-wrapped
{
white-space
:
pre-wrap
;
}
.editable-container.editable-popup
{
max-width
:
none
!important
;
/* without this rule poshytip/tooltip does not stretch */
}
.editable-container.popover
{
width
:
auto
;
/* without this rule popover does not stretch */
}
.editable-container.editable-inline
{
display
:
inline-block
;
vertical-align
:
middle
;
width
:
auto
;
/* inline-block emulation for IE7*/
zoom
:
1
;
*
display
:
inline
;
}
.editable-container.ui-widget
{
font-size
:
inherit
;
/* jqueryui widget font 1.1em too big, overwrite it */
z-index
:
9990
;
/* should be less than select2 dropdown z-index to close dropdown first when click */
}
.editable-click
,
a
.editable-click
,
a
.editable-click
:hover
{
text-decoration
:
none
;
border-bottom
:
dashed
1px
#0088cc
;
}
.editable-click.editable-disabled
,
a
.editable-click.editable-disabled
,
a
.editable-click.editable-disabled
:hover
{
color
:
#585858
;
cursor
:
default
;
border-bottom
:
none
;
}
.editable-empty
,
.editable-empty
:hover
,
.editable-empty
:focus
{
font-style
:
italic
;
color
:
#DD1144
;
/* border-bottom: none; */
text-decoration
:
none
;
}
.editable-unsaved
{
font-weight
:
bold
;
}
.editable-unsaved
:after
{
/* content: '*'*/
}
.editable-bg-transition
{
-webkit-transition
:
background-color
1400ms
ease-out
;
-moz-transition
:
background-color
1400ms
ease-out
;
-o-transition
:
background-color
1400ms
ease-out
;
-ms-transition
:
background-color
1400ms
ease-out
;
transition
:
background-color
1400ms
ease-out
;
}
/*see https://github.com/vitalets/x-editable/issues/139 */
.form-horizontal
.editable
{
padding-top
:
5px
;
display
:
inline-block
;
}
/*!
* Datepicker for Bootstrap
*
* Copyright 2012 Stefan Petre
* Improvements by Andrew Rowls
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
*/
.datepicker
{
padding
:
4px
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
direction
:
ltr
;
/*.dow {
border-top: 1px solid #ddd !important;
}*/
}
.datepicker-inline
{
width
:
220px
;
}
.datepicker.datepicker-rtl
{
direction
:
rtl
;
}
.datepicker.datepicker-rtl
table
tr
td
span
{
float
:
right
;
}
.datepicker-dropdown
{
top
:
0
;
left
:
0
;
}
.datepicker-dropdown
:before
{
content
:
''
;
display
:
inline-block
;
border-left
:
7px
solid
transparent
;
border-right
:
7px
solid
transparent
;
border-bottom
:
7px
solid
#ccc
;
border-bottom-color
:
rgba
(
0
,
0
,
0
,
0.2
);
position
:
absolute
;
top
:
-7px
;
left
:
6px
;
}
.datepicker-dropdown
:after
{
content
:
''
;
display
:
inline-block
;
border-left
:
6px
solid
transparent
;
border-right
:
6px
solid
transparent
;
border-bottom
:
6px
solid
#ffffff
;
position
:
absolute
;
top
:
-6px
;
left
:
7px
;
}
.datepicker
>
div
{
display
:
none
;
}
.datepicker.days
div
.datepicker-days
{
display
:
block
;
}
.datepicker.months
div
.datepicker-months
{
display
:
block
;
}
.datepicker.years
div
.datepicker-years
{
display
:
block
;
}
.datepicker
table
{
margin
:
0
;
}
.datepicker
td
,
.datepicker
th
{
text-align
:
center
;
width
:
20px
;
height
:
20px
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
border
:
none
;
}
.table-striped
.datepicker
table
tr
td
,
.table-striped
.datepicker
table
tr
th
{
background-color
:
transparent
;
}
.datepicker
table
tr
td
.day
:hover
{
background
:
#eeeeee
;
cursor
:
pointer
;
}
.datepicker
table
tr
td
.old
,
.datepicker
table
tr
td
.new
{
color
:
#999999
;
}
.datepicker
table
tr
td
.disabled
,
.datepicker
table
tr
td
.disabled
:hover
{
background
:
none
;
color
:
#999999
;
cursor
:
default
;
}
.datepicker
table
tr
td
.today
,
.datepicker
table
tr
td
.today
:hover
,
.datepicker
table
tr
td
.today.disabled
,
.datepicker
table
tr
td
.today.disabled
:hover
{
background-color
:
#fde19a
;
background-image
:
-moz-linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-image
:
-ms-linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#fdd49a
),
to
(
#fdf59a
));
background-image
:
-webkit-linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-image
:
-o-linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-image
:
linear-gradient
(
top
,
#fdd49a
,
#fdf59a
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#fdd49a'
,
endColorstr
=
'#fdf59a'
,
GradientType
=
0
);
border-color
:
#fdf59a
#fdf59a
#fbed50
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
color
:
#000
;
}
.datepicker
table
tr
td
.today
:hover
,
.datepicker
table
tr
td
.today
:hover:hover
,
.datepicker
table
tr
td
.today.disabled
:hover
,
.datepicker
table
tr
td
.today.disabled
:hover:hover
,
.datepicker
table
tr
td
.today
:active
,
.datepicker
table
tr
td
.today
:hover:active
,
.datepicker
table
tr
td
.today.disabled
:active
,
.datepicker
table
tr
td
.today.disabled
:hover:active
,
.datepicker
table
tr
td
.today.active
,
.datepicker
table
tr
td
.today
:hover
.active
,
.datepicker
table
tr
td
.today.disabled.active
,
.datepicker
table
tr
td
.today.disabled
:hover
.active
,
.datepicker
table
tr
td
.today.disabled
,
.datepicker
table
tr
td
.today
:hover
.disabled
,
.datepicker
table
tr
td
.today.disabled.disabled
,
.datepicker
table
tr
td
.today.disabled
:hover
.disabled
,
.datepicker
table
tr
td
.today
[
disabled
],
.datepicker
table
tr
td
.today
:hover
[
disabled
],
.datepicker
table
tr
td
.today.disabled
[
disabled
],
.datepicker
table
tr
td
.today.disabled
:hover
[
disabled
]
{
background-color
:
#fdf59a
;
}
.datepicker
table
tr
td
.today
:active
,
.datepicker
table
tr
td
.today
:hover:active
,
.datepicker
table
tr
td
.today.disabled
:active
,
.datepicker
table
tr
td
.today.disabled
:hover:active
,
.datepicker
table
tr
td
.today.active
,
.datepicker
table
tr
td
.today
:hover
.active
,
.datepicker
table
tr
td
.today.disabled.active
,
.datepicker
table
tr
td
.today.disabled
:hover
.active
{
background-color
:
#fbf069
\
9
;
}
.datepicker
table
tr
td
.today
:hover:hover
{
color
:
#000
;
}
.datepicker
table
tr
td
.today.active
:hover
{
color
:
#fff
;
}
.datepicker
table
tr
td
.range
,
.datepicker
table
tr
td
.range
:hover
,
.datepicker
table
tr
td
.range.disabled
,
.datepicker
table
tr
td
.range.disabled
:hover
{
background
:
#eeeeee
;
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
;
}
.datepicker
table
tr
td
.range.today
,
.datepicker
table
tr
td
.range.today
:hover
,
.datepicker
table
tr
td
.range.today.disabled
,
.datepicker
table
tr
td
.range.today.disabled
:hover
{
background-color
:
#f3d17a
;
background-image
:
-moz-linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-image
:
-ms-linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#f3c17a
),
to
(
#f3e97a
));
background-image
:
-webkit-linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-image
:
-o-linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-image
:
linear-gradient
(
top
,
#f3c17a
,
#f3e97a
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#f3c17a'
,
endColorstr
=
'#f3e97a'
,
GradientType
=
0
);
border-color
:
#f3e97a
#f3e97a
#edde34
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
;
}
.datepicker
table
tr
td
.range.today
:hover
,
.datepicker
table
tr
td
.range.today
:hover:hover
,
.datepicker
table
tr
td
.range.today.disabled
:hover
,
.datepicker
table
tr
td
.range.today.disabled
:hover:hover
,
.datepicker
table
tr
td
.range.today
:active
,
.datepicker
table
tr
td
.range.today
:hover:active
,
.datepicker
table
tr
td
.range.today.disabled
:active
,
.datepicker
table
tr
td
.range.today.disabled
:hover:active
,
.datepicker
table
tr
td
.range.today.active
,
.datepicker
table
tr
td
.range.today
:hover
.active
,
.datepicker
table
tr
td
.range.today.disabled.active
,
.datepicker
table
tr
td
.range.today.disabled
:hover
.active
,
.datepicker
table
tr
td
.range.today.disabled
,
.datepicker
table
tr
td
.range.today
:hover
.disabled
,
.datepicker
table
tr
td
.range.today.disabled.disabled
,
.datepicker
table
tr
td
.range.today.disabled
:hover
.disabled
,
.datepicker
table
tr
td
.range.today
[
disabled
],
.datepicker
table
tr
td
.range.today
:hover
[
disabled
],
.datepicker
table
tr
td
.range.today.disabled
[
disabled
],
.datepicker
table
tr
td
.range.today.disabled
:hover
[
disabled
]
{
background-color
:
#f3e97a
;
}
.datepicker
table
tr
td
.range.today
:active
,
.datepicker
table
tr
td
.range.today
:hover:active
,
.datepicker
table
tr
td
.range.today.disabled
:active
,
.datepicker
table
tr
td
.range.today.disabled
:hover:active
,
.datepicker
table
tr
td
.range.today.active
,
.datepicker
table
tr
td
.range.today
:hover
.active
,
.datepicker
table
tr
td
.range.today.disabled.active
,
.datepicker
table
tr
td
.range.today.disabled
:hover
.active
{
background-color
:
#efe24b
\
9
;
}
.datepicker
table
tr
td
.selected
,
.datepicker
table
tr
td
.selected
:hover
,
.datepicker
table
tr
td
.selected.disabled
,
.datepicker
table
tr
td
.selected.disabled
:hover
{
background-color
:
#9e9e9e
;
background-image
:
-moz-linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-image
:
-ms-linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#b3b3b3
),
to
(
#808080
));
background-image
:
-webkit-linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-image
:
-o-linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-image
:
linear-gradient
(
top
,
#b3b3b3
,
#808080
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#b3b3b3'
,
endColorstr
=
'#808080'
,
GradientType
=
0
);
border-color
:
#808080
#808080
#595959
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
color
:
#fff
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
);
}
.datepicker
table
tr
td
.selected
:hover
,
.datepicker
table
tr
td
.selected
:hover:hover
,
.datepicker
table
tr
td
.selected.disabled
:hover
,
.datepicker
table
tr
td
.selected.disabled
:hover:hover
,
.datepicker
table
tr
td
.selected
:active
,
.datepicker
table
tr
td
.selected
:hover:active
,
.datepicker
table
tr
td
.selected.disabled
:active
,
.datepicker
table
tr
td
.selected.disabled
:hover:active
,
.datepicker
table
tr
td
.selected.active
,
.datepicker
table
tr
td
.selected
:hover
.active
,
.datepicker
table
tr
td
.selected.disabled.active
,
.datepicker
table
tr
td
.selected.disabled
:hover
.active
,
.datepicker
table
tr
td
.selected.disabled
,
.datepicker
table
tr
td
.selected
:hover
.disabled
,
.datepicker
table
tr
td
.selected.disabled.disabled
,
.datepicker
table
tr
td
.selected.disabled
:hover
.disabled
,
.datepicker
table
tr
td
.selected
[
disabled
],
.datepicker
table
tr
td
.selected
:hover
[
disabled
],
.datepicker
table
tr
td
.selected.disabled
[
disabled
],
.datepicker
table
tr
td
.selected.disabled
:hover
[
disabled
]
{
background-color
:
#808080
;
}
.datepicker
table
tr
td
.selected
:active
,
.datepicker
table
tr
td
.selected
:hover:active
,
.datepicker
table
tr
td
.selected.disabled
:active
,
.datepicker
table
tr
td
.selected.disabled
:hover:active
,
.datepicker
table
tr
td
.selected.active
,
.datepicker
table
tr
td
.selected
:hover
.active
,
.datepicker
table
tr
td
.selected.disabled.active
,
.datepicker
table
tr
td
.selected.disabled
:hover
.active
{
background-color
:
#666666
\
9
;
}
.datepicker
table
tr
td
.active
,
.datepicker
table
tr
td
.active
:hover
,
.datepicker
table
tr
td
.active.disabled
,
.datepicker
table
tr
td
.active.disabled
:hover
{
background-color
:
#006dcc
;
background-image
:
-moz-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-ms-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#0088cc
),
to
(
#0044cc
));
background-image
:
-webkit-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-o-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#0088cc'
,
endColorstr
=
'#0044cc'
,
GradientType
=
0
);
border-color
:
#0044cc
#0044cc
#002a80
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
color
:
#fff
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
);
}
.datepicker
table
tr
td
.active
:hover
,
.datepicker
table
tr
td
.active
:hover:hover
,
.datepicker
table
tr
td
.active.disabled
:hover
,
.datepicker
table
tr
td
.active.disabled
:hover:hover
,
.datepicker
table
tr
td
.active
:active
,
.datepicker
table
tr
td
.active
:hover:active
,
.datepicker
table
tr
td
.active.disabled
:active
,
.datepicker
table
tr
td
.active.disabled
:hover:active
,
.datepicker
table
tr
td
.active.active
,
.datepicker
table
tr
td
.active
:hover
.active
,
.datepicker
table
tr
td
.active.disabled.active
,
.datepicker
table
tr
td
.active.disabled
:hover
.active
,
.datepicker
table
tr
td
.active.disabled
,
.datepicker
table
tr
td
.active
:hover
.disabled
,
.datepicker
table
tr
td
.active.disabled.disabled
,
.datepicker
table
tr
td
.active.disabled
:hover
.disabled
,
.datepicker
table
tr
td
.active
[
disabled
],
.datepicker
table
tr
td
.active
:hover
[
disabled
],
.datepicker
table
tr
td
.active.disabled
[
disabled
],
.datepicker
table
tr
td
.active.disabled
:hover
[
disabled
]
{
background-color
:
#0044cc
;
}
.datepicker
table
tr
td
.active
:active
,
.datepicker
table
tr
td
.active
:hover:active
,
.datepicker
table
tr
td
.active.disabled
:active
,
.datepicker
table
tr
td
.active.disabled
:hover:active
,
.datepicker
table
tr
td
.active.active
,
.datepicker
table
tr
td
.active
:hover
.active
,
.datepicker
table
tr
td
.active.disabled.active
,
.datepicker
table
tr
td
.active.disabled
:hover
.active
{
background-color
:
#003399
\
9
;
}
.datepicker
table
tr
td
span
{
display
:
block
;
width
:
23%
;
height
:
54px
;
line-height
:
54px
;
float
:
left
;
margin
:
1%
;
cursor
:
pointer
;
-webkit-border-radius
:
4px
;
-moz-border-radius
:
4px
;
border-radius
:
4px
;
}
.datepicker
table
tr
td
span
:hover
{
background
:
#eeeeee
;
}
.datepicker
table
tr
td
span
.disabled
,
.datepicker
table
tr
td
span
.disabled
:hover
{
background
:
none
;
color
:
#999999
;
cursor
:
default
;
}
.datepicker
table
tr
td
span
.active
,
.datepicker
table
tr
td
span
.active
:hover
,
.datepicker
table
tr
td
span
.active.disabled
,
.datepicker
table
tr
td
span
.active.disabled
:hover
{
background-color
:
#006dcc
;
background-image
:
-moz-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-ms-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-webkit-gradient
(
linear
,
0
0
,
0
100%
,
from
(
#0088cc
),
to
(
#0044cc
));
background-image
:
-webkit-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
-o-linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-image
:
linear-gradient
(
top
,
#0088cc
,
#0044cc
);
background-repeat
:
repeat-x
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#0088cc'
,
endColorstr
=
'#0044cc'
,
GradientType
=
0
);
border-color
:
#0044cc
#0044cc
#002a80
;
border-color
:
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.1
)
rgba
(
0
,
0
,
0
,
0.25
);
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
enabled
=
false
);
color
:
#fff
;
text-shadow
:
0
-1px
0
rgba
(
0
,
0
,
0
,
0.25
);
}
.datepicker
table
tr
td
span
.active
:hover
,
.datepicker
table
tr
td
span
.active
:hover:hover
,
.datepicker
table
tr
td
span
.active.disabled
:hover
,
.datepicker
table
tr
td
span
.active.disabled
:hover:hover
,
.datepicker
table
tr
td
span
.active
:active
,
.datepicker
table
tr
td
span
.active
:hover:active
,
.datepicker
table
tr
td
span
.active.disabled
:active
,
.datepicker
table
tr
td
span
.active.disabled
:hover:active
,
.datepicker
table
tr
td
span
.active.active
,
.datepicker
table
tr
td
span
.active
:hover
.active
,
.datepicker
table
tr
td
span
.active.disabled.active
,
.datepicker
table
tr
td
span
.active.disabled
:hover
.active
,
.datepicker
table
tr
td
span
.active.disabled
,
.datepicker
table
tr
td
span
.active
:hover
.disabled
,
.datepicker
table
tr
td
span
.active.disabled.disabled
,
.datepicker
table
tr
td
span
.active.disabled
:hover
.disabled
,
.datepicker
table
tr
td
span
.active
[
disabled
],
.datepicker
table
tr
td
span
.active
:hover
[
disabled
],
.datepicker
table
tr
td
span
.active.disabled
[
disabled
],
.datepicker
table
tr
td
span
.active.disabled
:hover
[
disabled
]
{
background-color
:
#0044cc
;
}
.datepicker
table
tr
td
span
.active
:active
,
.datepicker
table
tr
td
span
.active
:hover:active
,
.datepicker
table
tr
td
span
.active.disabled
:active
,
.datepicker
table
tr
td
span
.active.disabled
:hover:active
,
.datepicker
table
tr
td
span
.active.active
,
.datepicker
table
tr
td
span
.active
:hover
.active
,
.datepicker
table
tr
td
span
.active.disabled.active
,
.datepicker
table
tr
td
span
.active.disabled
:hover
.active
{
background-color
:
#003399
\
9
;
}
.datepicker
table
tr
td
span
.old
,
.datepicker
table
tr
td
span
.new
{
color
:
#999999
;
}
.datepicker
th
.datepicker-switch
{
width
:
145px
;
}
.datepicker
thead
tr
:first-child
th
,
.datepicker
tfoot
tr
th
{
cursor
:
pointer
;
}
.datepicker
thead
tr
:first-child
th
:hover
,
.datepicker
tfoot
tr
th
:hover
{
background
:
#eeeeee
;
}
.datepicker
.cw
{
font-size
:
10px
;
width
:
12px
;
padding
:
0
2px
0
5px
;
vertical-align
:
middle
;
}
.datepicker
thead
tr
:first-child
th
.cw
{
cursor
:
default
;
background-color
:
transparent
;
}
.input-append.date
.add-on
i
,
.input-prepend.date
.add-on
i
{
display
:
block
;
cursor
:
pointer
;
width
:
16px
;
height
:
16px
;
}
.input-daterange
input
{
text-align
:
center
;
}
.input-daterange
input
:first-child
{
-webkit-border-radius
:
3px
0
0
3px
;
-moz-border-radius
:
3px
0
0
3px
;
border-radius
:
3px
0
0
3px
;
}
.input-daterange
input
:last-child
{
-webkit-border-radius
:
0
3px
3px
0
;
-moz-border-radius
:
0
3px
3px
0
;
border-radius
:
0
3px
3px
0
;
}
.input-daterange
.add-on
{
display
:
inline-block
;
width
:
auto
;
min-width
:
16px
;
height
:
18px
;
padding
:
4px
5px
;
font-weight
:
normal
;
line-height
:
18px
;
text-align
:
center
;
text-shadow
:
0
1px
0
#ffffff
;
vertical-align
:
middle
;
background-color
:
#eeeeee
;
border
:
1px
solid
#ccc
;
margin-left
:
-5px
;
margin-right
:
-5px
;
}
flask_admin/static/vendor/x-editable/img/clear.png
0 → 100644
View file @
2b4bfe35
509 Bytes
flask_admin/static/vendor/x-editable/img/loading.gif
0 → 100644
View file @
2b4bfe35
1.81 KB
flask_admin/static/vendor/x-editable/js/bootstrap2-editable-1.5.1.min.js
0 → 100644
View file @
2b4bfe35
/*! X-editable - v1.5.1
* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
* http://github.com/vitalets/x-editable
* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */
!
function
(
a
){
"use strict"
;
var
b
=
function
(
b
,
c
){
this
.
options
=
a
.
extend
({},
a
.
fn
.
editableform
.
defaults
,
c
),
this
.
$div
=
a
(
b
),
this
.
options
.
scope
||
(
this
.
options
.
scope
=
this
)};
b
.
prototype
=
{
constructor
:
b
,
initInput
:
function
(){
this
.
input
=
this
.
options
.
input
,
this
.
value
=
this
.
input
.
str2value
(
this
.
options
.
value
),
this
.
input
.
prerender
()},
initTemplate
:
function
(){
this
.
$form
=
a
(
a
.
fn
.
editableform
.
template
)},
initButtons
:
function
(){
var
b
=
this
.
$form
.
find
(
".editable-buttons"
);
b
.
append
(
a
.
fn
.
editableform
.
buttons
),
"bottom"
===
this
.
options
.
showbuttons
&&
b
.
addClass
(
"editable-buttons-bottom"
)},
render
:
function
(){
this
.
$loading
=
a
(
a
.
fn
.
editableform
.
loading
),
this
.
$div
.
empty
().
append
(
this
.
$loading
),
this
.
initTemplate
(),
this
.
options
.
showbuttons
?
this
.
initButtons
():
this
.
$form
.
find
(
".editable-buttons"
).
remove
(),
this
.
showLoading
(),
this
.
isSaving
=!
1
,
this
.
$div
.
triggerHandler
(
"rendering"
),
this
.
initInput
(),
this
.
$form
.
find
(
"div.editable-input"
).
append
(
this
.
input
.
$tpl
),
this
.
$div
.
append
(
this
.
$form
),
a
.
when
(
this
.
input
.
render
()).
then
(
a
.
proxy
(
function
(){
if
(
this
.
options
.
showbuttons
||
this
.
input
.
autosubmit
(),
this
.
$form
.
find
(
".editable-cancel"
).
click
(
a
.
proxy
(
this
.
cancel
,
this
)),
this
.
input
.
error
)
this
.
error
(
this
.
input
.
error
),
this
.
$form
.
find
(
".editable-submit"
).
attr
(
"disabled"
,
!
0
),
this
.
input
.
$input
.
attr
(
"disabled"
,
!
0
),
this
.
$form
.
submit
(
function
(
a
){
a
.
preventDefault
()});
else
{
this
.
error
(
!
1
),
this
.
input
.
$input
.
removeAttr
(
"disabled"
),
this
.
$form
.
find
(
".editable-submit"
).
removeAttr
(
"disabled"
);
var
b
=
null
===
this
.
value
||
void
0
===
this
.
value
||
""
===
this
.
value
?
this
.
options
.
defaultValue
:
this
.
value
;
this
.
input
.
value2input
(
b
),
this
.
$form
.
submit
(
a
.
proxy
(
this
.
submit
,
this
))}
this
.
$div
.
triggerHandler
(
"rendered"
),
this
.
showForm
(),
this
.
input
.
postrender
&&
this
.
input
.
postrender
()},
this
))},
cancel
:
function
(){
this
.
$div
.
triggerHandler
(
"cancel"
)},
showLoading
:
function
(){
var
a
,
b
;
this
.
$form
?(
a
=
this
.
$form
.
outerWidth
(),
b
=
this
.
$form
.
outerHeight
(),
a
&&
this
.
$loading
.
width
(
a
),
b
&&
this
.
$loading
.
height
(
b
),
this
.
$form
.
hide
()):(
a
=
this
.
$loading
.
parent
().
width
(),
a
&&
this
.
$loading
.
width
(
a
)),
this
.
$loading
.
show
()},
showForm
:
function
(
a
){
this
.
$loading
.
hide
(),
this
.
$form
.
show
(),
a
!==!
1
&&
this
.
input
.
activate
(),
this
.
$div
.
triggerHandler
(
"show"
)},
error
:
function
(
b
){
var
c
,
d
=
this
.
$form
.
find
(
".control-group"
),
e
=
this
.
$form
.
find
(
".editable-error-block"
);
if
(
b
===!
1
)
d
.
removeClass
(
a
.
fn
.
editableform
.
errorGroupClass
),
e
.
removeClass
(
a
.
fn
.
editableform
.
errorBlockClass
).
empty
().
hide
();
else
{
if
(
b
){
c
=
(
""
+
b
).
split
(
"
\n
"
);
for
(
var
f
=
0
;
f
<
c
.
length
;
f
++
)
c
[
f
]
=
a
(
"<div>"
).
text
(
c
[
f
]).
html
();
b
=
c
.
join
(
"<br>"
)}
d
.
addClass
(
a
.
fn
.
editableform
.
errorGroupClass
),
e
.
addClass
(
a
.
fn
.
editableform
.
errorBlockClass
).
html
(
b
).
show
()}},
submit
:
function
(
b
){
b
.
stopPropagation
(),
b
.
preventDefault
();
var
c
=
this
.
input
.
input2value
(),
d
=
this
.
validate
(
c
);
if
(
"object"
===
a
.
type
(
d
)
&&
void
0
!==
d
.
newValue
){
if
(
c
=
d
.
newValue
,
this
.
input
.
value2input
(
c
),
"string"
==
typeof
d
.
msg
)
return
this
.
error
(
d
.
msg
),
this
.
showForm
(),
void
0
}
else
if
(
d
)
return
this
.
error
(
d
),
this
.
showForm
(),
void
0
;
if
(
!
this
.
options
.
savenochange
&&
this
.
input
.
value2str
(
c
)
==
this
.
input
.
value2str
(
this
.
value
))
return
this
.
$div
.
triggerHandler
(
"nochange"
),
void
0
;
var
e
=
this
.
input
.
value2submit
(
c
);
this
.
isSaving
=!
0
,
a
.
when
(
this
.
save
(
e
)).
done
(
a
.
proxy
(
function
(
a
){
this
.
isSaving
=!
1
;
var
b
=
"function"
==
typeof
this
.
options
.
success
?
this
.
options
.
success
.
call
(
this
.
options
.
scope
,
a
,
c
):
null
;
return
b
===!
1
?(
this
.
error
(
!
1
),
this
.
showForm
(
!
1
),
void
0
):
"string"
==
typeof
b
?(
this
.
error
(
b
),
this
.
showForm
(),
void
0
):(
b
&&
"object"
==
typeof
b
&&
b
.
hasOwnProperty
(
"newValue"
)
&&
(
c
=
b
.
newValue
),
this
.
error
(
!
1
),
this
.
value
=
c
,
this
.
$div
.
triggerHandler
(
"save"
,{
newValue
:
c
,
submitValue
:
e
,
response
:
a
}),
void
0
)},
this
)).
fail
(
a
.
proxy
(
function
(
a
){
this
.
isSaving
=!
1
;
var
b
;
b
=
"function"
==
typeof
this
.
options
.
error
?
this
.
options
.
error
.
call
(
this
.
options
.
scope
,
a
,
c
):
"string"
==
typeof
a
?
a
:
a
.
responseText
||
a
.
statusText
||
"Unknown error!"
,
this
.
error
(
b
),
this
.
showForm
()},
this
))},
save
:
function
(
b
){
this
.
options
.
pk
=
a
.
fn
.
editableutils
.
tryParseJson
(
this
.
options
.
pk
,
!
0
);
var
c
,
d
=
"function"
==
typeof
this
.
options
.
pk
?
this
.
options
.
pk
.
call
(
this
.
options
.
scope
):
this
.
options
.
pk
,
e
=!!
(
"function"
==
typeof
this
.
options
.
url
||
this
.
options
.
url
&&
(
"always"
===
this
.
options
.
send
||
"auto"
===
this
.
options
.
send
&&
null
!==
d
&&
void
0
!==
d
));
return
e
?(
this
.
showLoading
(),
c
=
{
name
:
this
.
options
.
name
||
""
,
value
:
b
,
pk
:
d
},
"function"
==
typeof
this
.
options
.
params
?
c
=
this
.
options
.
params
.
call
(
this
.
options
.
scope
,
c
):(
this
.
options
.
params
=
a
.
fn
.
editableutils
.
tryParseJson
(
this
.
options
.
params
,
!
0
),
a
.
extend
(
c
,
this
.
options
.
params
)),
"function"
==
typeof
this
.
options
.
url
?
this
.
options
.
url
.
call
(
this
.
options
.
scope
,
c
):
a
.
ajax
(
a
.
extend
({
url
:
this
.
options
.
url
,
data
:
c
,
type
:
"POST"
},
this
.
options
.
ajaxOptions
))):
void
0
},
validate
:
function
(
a
){
return
void
0
===
a
&&
(
a
=
this
.
value
),
"function"
==
typeof
this
.
options
.
validate
?
this
.
options
.
validate
.
call
(
this
.
options
.
scope
,
a
):
void
0
},
option
:
function
(
a
,
b
){
a
in
this
.
options
&&
(
this
.
options
[
a
]
=
b
),
"value"
===
a
&&
this
.
setValue
(
b
)},
setValue
:
function
(
a
,
b
){
this
.
value
=
b
?
this
.
input
.
str2value
(
a
):
a
,
this
.
$form
&&
this
.
$form
.
is
(
":visible"
)
&&
this
.
input
.
value2input
(
this
.
value
)}},
a
.
fn
.
editableform
=
function
(
c
){
var
d
=
arguments
;
return
this
.
each
(
function
(){
var
e
=
a
(
this
),
f
=
e
.
data
(
"editableform"
),
g
=
"object"
==
typeof
c
&&
c
;
f
||
e
.
data
(
"editableform"
,
f
=
new
b
(
this
,
g
)),
"string"
==
typeof
c
&&
f
[
c
].
apply
(
f
,
Array
.
prototype
.
slice
.
call
(
d
,
1
))})},
a
.
fn
.
editableform
.
Constructor
=
b
,
a
.
fn
.
editableform
.
defaults
=
{
type
:
"text"
,
url
:
null
,
params
:
null
,
name
:
null
,
pk
:
null
,
value
:
null
,
defaultValue
:
null
,
send
:
"auto"
,
validate
:
null
,
success
:
null
,
error
:
null
,
ajaxOptions
:
null
,
showbuttons
:
!
0
,
scope
:
null
,
savenochange
:
!
1
},
a
.
fn
.
editableform
.
template
=
'<form class="form-inline editableform"><div class="control-group"><div><div class="editable-input"></div><div class="editable-buttons"></div></div><div class="editable-error-block"></div></div></form>'
,
a
.
fn
.
editableform
.
loading
=
'<div class="editableform-loading"></div>'
,
a
.
fn
.
editableform
.
buttons
=
'<button type="submit" class="editable-submit">ok</button><button type="button" class="editable-cancel">cancel</button>'
,
a
.
fn
.
editableform
.
errorGroupClass
=
null
,
a
.
fn
.
editableform
.
errorBlockClass
=
"editable-error"
,
a
.
fn
.
editableform
.
engine
=
"jquery"
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
fn
.
editableutils
=
{
inherit
:
function
(
a
,
b
){
var
c
=
function
(){};
c
.
prototype
=
b
.
prototype
,
a
.
prototype
=
new
c
,
a
.
prototype
.
constructor
=
a
,
a
.
superclass
=
b
.
prototype
},
setCursorPosition
:
function
(
a
,
b
){
if
(
a
.
setSelectionRange
)
a
.
setSelectionRange
(
b
,
b
);
else
if
(
a
.
createTextRange
){
var
c
=
a
.
createTextRange
();
c
.
collapse
(
!
0
),
c
.
moveEnd
(
"character"
,
b
),
c
.
moveStart
(
"character"
,
b
),
c
.
select
()}},
tryParseJson
:
function
(
a
,
b
){
if
(
"string"
==
typeof
a
&&
a
.
length
&&
a
.
match
(
/^
[\{\[]
.*
[\}\]]
$/
))
if
(
b
)
try
{
a
=
new
Function
(
"return "
+
a
)()}
catch
(
c
){}
finally
{
return
a
}
else
a
=
new
Function
(
"return "
+
a
)();
return
a
},
sliceObj
:
function
(
b
,
c
,
d
){
var
e
,
f
,
g
=
{};
if
(
!
a
.
isArray
(
c
)
||!
c
.
length
)
return
g
;
for
(
var
h
=
0
;
h
<
c
.
length
;
h
++
)
e
=
c
[
h
],
b
.
hasOwnProperty
(
e
)
&&
(
g
[
e
]
=
b
[
e
]),
d
!==!
0
&&
(
f
=
e
.
toLowerCase
(),
b
.
hasOwnProperty
(
f
)
&&
(
g
[
e
]
=
b
[
f
]));
return
g
},
getConfigData
:
function
(
b
){
var
c
=
{};
return
a
.
each
(
b
.
data
(),
function
(
a
,
b
){(
"object"
!=
typeof
b
||
b
&&
"object"
==
typeof
b
&&
(
b
.
constructor
===
Object
||
b
.
constructor
===
Array
))
&&
(
c
[
a
]
=
b
)}),
c
},
objectKeys
:
function
(
a
){
if
(
Object
.
keys
)
return
Object
.
keys
(
a
);
if
(
a
!==
Object
(
a
))
throw
new
TypeError
(
"Object.keys called on a non-object"
);
var
b
,
c
=
[];
for
(
b
in
a
)
Object
.
prototype
.
hasOwnProperty
.
call
(
a
,
b
)
&&
c
.
push
(
b
);
return
c
},
escape
:
function
(
b
){
return
a
(
"<div>"
).
text
(
b
).
html
()},
itemsByValue
:
function
(
b
,
c
,
d
){
if
(
!
c
||
null
===
b
)
return
[];
if
(
"function"
!=
typeof
d
){
var
e
=
d
||
"value"
;
d
=
function
(
a
){
return
a
[
e
]}}
var
f
=
a
.
isArray
(
b
),
g
=
[],
h
=
this
;
return
a
.
each
(
c
,
function
(
c
,
e
){
if
(
e
.
children
)
g
=
g
.
concat
(
h
.
itemsByValue
(
b
,
e
.
children
,
d
));
else
if
(
f
)
a
.
grep
(
b
,
function
(
a
){
return
a
==
(
e
&&
"object"
==
typeof
e
?
d
(
e
):
e
)}).
length
&&
g
.
push
(
e
);
else
{
var
i
=
e
&&
"object"
==
typeof
e
?
d
(
e
):
e
;
b
==
i
&&
g
.
push
(
e
)}}),
g
},
createInput
:
function
(
b
){
var
c
,
d
,
e
,
f
=
b
.
type
;
return
"date"
===
f
&&
(
"inline"
===
b
.
mode
?
a
.
fn
.
editabletypes
.
datefield
?
f
=
"datefield"
:
a
.
fn
.
editabletypes
.
dateuifield
&&
(
f
=
"dateuifield"
):
a
.
fn
.
editabletypes
.
date
?
f
=
"date"
:
a
.
fn
.
editabletypes
.
dateui
&&
(
f
=
"dateui"
),
"date"
!==
f
||
a
.
fn
.
editabletypes
.
date
||
(
f
=
"combodate"
)),
"datetime"
===
f
&&
"inline"
===
b
.
mode
&&
(
f
=
"datetimefield"
),
"wysihtml5"
!==
f
||
a
.
fn
.
editabletypes
[
f
]
||
(
f
=
"textarea"
),
"function"
==
typeof
a
.
fn
.
editabletypes
[
f
]?(
c
=
a
.
fn
.
editabletypes
[
f
],
d
=
this
.
sliceObj
(
b
,
this
.
objectKeys
(
c
.
defaults
)),
e
=
new
c
(
d
)):(
a
.
error
(
"Unknown type: "
+
f
),
!
1
)},
supportsTransitions
:
function
(){
var
a
=
document
.
body
||
document
.
documentElement
,
b
=
a
.
style
,
c
=
"transition"
,
d
=
[
"Moz"
,
"Webkit"
,
"Khtml"
,
"O"
,
"ms"
];
if
(
"string"
==
typeof
b
[
c
])
return
!
0
;
c
=
c
.
charAt
(
0
).
toUpperCase
()
+
c
.
substr
(
1
);
for
(
var
e
=
0
;
e
<
d
.
length
;
e
++
)
if
(
"string"
==
typeof
b
[
d
[
e
]
+
c
])
return
!
0
;
return
!
1
}}}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
,
b
){
this
.
init
(
a
,
b
)},
c
=
function
(
a
,
b
){
this
.
init
(
a
,
b
)};
b
.
prototype
=
{
containerName
:
null
,
containerDataName
:
null
,
innerCss
:
null
,
containerClass
:
"editable-container editable-popup"
,
defaults
:{},
init
:
function
(
c
,
d
){
this
.
$element
=
a
(
c
),
this
.
options
=
a
.
extend
({},
a
.
fn
.
editableContainer
.
defaults
,
d
),
this
.
splitOptions
(),
this
.
formOptions
.
scope
=
this
.
$element
[
0
],
this
.
initContainer
(),
this
.
delayedHide
=!
1
,
this
.
$element
.
on
(
"destroyed"
,
a
.
proxy
(
function
(){
this
.
destroy
()},
this
)),
a
(
document
).
data
(
"editable-handlers-attached"
)
||
(
a
(
document
).
on
(
"keyup.editable"
,
function
(
b
){
27
===
b
.
which
&&
a
(
".editable-open"
).
editableContainer
(
"hide"
)}),
a
(
document
).
on
(
"click.editable"
,
function
(
c
){
var
d
,
e
=
a
(
c
.
target
),
f
=
[
".editable-container"
,
".ui-datepicker-header"
,
".datepicker"
,
".modal-backdrop"
,
".bootstrap-wysihtml5-insert-image-modal"
,
".bootstrap-wysihtml5-insert-link-modal"
];
if
(
a
.
contains
(
document
.
documentElement
,
c
.
target
)
&&!
e
.
is
(
document
)){
for
(
d
=
0
;
d
<
f
.
length
;
d
++
)
if
(
e
.
is
(
f
[
d
])
||
e
.
parents
(
f
[
d
]).
length
)
return
;
b
.
prototype
.
closeOthers
(
c
.
target
)}}),
a
(
document
).
data
(
"editable-handlers-attached"
,
!
0
))},
splitOptions
:
function
(){
if
(
this
.
containerOptions
=
{},
this
.
formOptions
=
{},
!
a
.
fn
[
this
.
containerName
])
throw
new
Error
(
this
.
containerName
+
" not found. Have you included corresponding js file?"
);
for
(
var
b
in
this
.
options
)
b
in
this
.
defaults
?
this
.
containerOptions
[
b
]
=
this
.
options
[
b
]:
this
.
formOptions
[
b
]
=
this
.
options
[
b
]},
tip
:
function
(){
return
this
.
container
()?
this
.
container
().
$tip
:
null
},
container
:
function
(){
var
a
;
return
this
.
containerDataName
&&
(
a
=
this
.
$element
.
data
(
this
.
containerDataName
))?
a
:
a
=
this
.
$element
.
data
(
this
.
containerName
)},
call
:
function
(){
this
.
$element
[
this
.
containerName
].
apply
(
this
.
$element
,
arguments
)},
initContainer
:
function
(){
this
.
call
(
this
.
containerOptions
)},
renderForm
:
function
(){
this
.
$form
.
editableform
(
this
.
formOptions
).
on
({
save
:
a
.
proxy
(
this
.
save
,
this
),
nochange
:
a
.
proxy
(
function
(){
this
.
hide
(
"nochange"
)},
this
),
cancel
:
a
.
proxy
(
function
(){
this
.
hide
(
"cancel"
)},
this
),
show
:
a
.
proxy
(
function
(){
this
.
delayedHide
?(
this
.
hide
(
this
.
delayedHide
.
reason
),
this
.
delayedHide
=!
1
):
this
.
setPosition
()},
this
),
rendering
:
a
.
proxy
(
this
.
setPosition
,
this
),
resize
:
a
.
proxy
(
this
.
setPosition
,
this
),
rendered
:
a
.
proxy
(
function
(){
this
.
$element
.
triggerHandler
(
"shown"
,
a
(
this
.
options
.
scope
).
data
(
"editable"
))},
this
)}).
editableform
(
"render"
)},
show
:
function
(
b
){
this
.
$element
.
addClass
(
"editable-open"
),
b
!==!
1
&&
this
.
closeOthers
(
this
.
$element
[
0
]),
this
.
innerShow
(),
this
.
tip
().
addClass
(
this
.
containerClass
),
this
.
$form
,
this
.
$form
=
a
(
"<div>"
),
this
.
tip
().
is
(
this
.
innerCss
)?
this
.
tip
().
append
(
this
.
$form
):
this
.
tip
().
find
(
this
.
innerCss
).
append
(
this
.
$form
),
this
.
renderForm
()},
hide
:
function
(
a
){
if
(
this
.
tip
()
&&
this
.
tip
().
is
(
":visible"
)
&&
this
.
$element
.
hasClass
(
"editable-open"
)){
if
(
this
.
$form
.
data
(
"editableform"
).
isSaving
)
return
this
.
delayedHide
=
{
reason
:
a
},
void
0
;
this
.
delayedHide
=!
1
,
this
.
$element
.
removeClass
(
"editable-open"
),
this
.
innerHide
(),
this
.
$element
.
triggerHandler
(
"hidden"
,
a
||
"manual"
)}},
innerShow
:
function
(){},
innerHide
:
function
(){},
toggle
:
function
(
a
){
this
.
container
()
&&
this
.
tip
()
&&
this
.
tip
().
is
(
":visible"
)?
this
.
hide
():
this
.
show
(
a
)},
setPosition
:
function
(){},
save
:
function
(
a
,
b
){
this
.
$element
.
triggerHandler
(
"save"
,
b
),
this
.
hide
(
"save"
)},
option
:
function
(
a
,
b
){
this
.
options
[
a
]
=
b
,
a
in
this
.
containerOptions
?(
this
.
containerOptions
[
a
]
=
b
,
this
.
setContainerOption
(
a
,
b
)):(
this
.
formOptions
[
a
]
=
b
,
this
.
$form
&&
this
.
$form
.
editableform
(
"option"
,
a
,
b
))},
setContainerOption
:
function
(
a
,
b
){
this
.
call
(
"option"
,
a
,
b
)},
destroy
:
function
(){
this
.
hide
(),
this
.
innerDestroy
(),
this
.
$element
.
off
(
"destroyed"
),
this
.
$element
.
removeData
(
"editableContainer"
)},
innerDestroy
:
function
(){},
closeOthers
:
function
(
b
){
a
(
".editable-open"
).
each
(
function
(
c
,
d
){
if
(
d
!==
b
&&!
a
(
d
).
find
(
b
).
length
){
var
e
=
a
(
d
),
f
=
e
.
data
(
"editableContainer"
);
f
&&
(
"cancel"
===
f
.
options
.
onblur
?
e
.
data
(
"editableContainer"
).
hide
(
"onblur"
):
"submit"
===
f
.
options
.
onblur
&&
e
.
data
(
"editableContainer"
).
tip
().
find
(
"form"
).
submit
())}})},
activate
:
function
(){
this
.
tip
&&
this
.
tip
().
is
(
":visible"
)
&&
this
.
$form
&&
this
.
$form
.
data
(
"editableform"
).
input
.
activate
()}},
a
.
fn
.
editableContainer
=
function
(
d
){
var
e
=
arguments
;
return
this
.
each
(
function
(){
var
f
=
a
(
this
),
g
=
"editableContainer"
,
h
=
f
.
data
(
g
),
i
=
"object"
==
typeof
d
&&
d
,
j
=
"inline"
===
i
.
mode
?
c
:
b
;
h
||
f
.
data
(
g
,
h
=
new
j
(
this
,
i
)),
"string"
==
typeof
d
&&
h
[
d
].
apply
(
h
,
Array
.
prototype
.
slice
.
call
(
e
,
1
))})},
a
.
fn
.
editableContainer
.
Popup
=
b
,
a
.
fn
.
editableContainer
.
Inline
=
c
,
a
.
fn
.
editableContainer
.
defaults
=
{
value
:
null
,
placement
:
"top"
,
autohide
:
!
0
,
onblur
:
"cancel"
,
anim
:
!
1
,
mode
:
"popup"
},
jQuery
.
event
.
special
.
destroyed
=
{
remove
:
function
(
a
){
a
.
handler
&&
a
.
handler
()}}}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
extend
(
a
.
fn
.
editableContainer
.
Inline
.
prototype
,
a
.
fn
.
editableContainer
.
Popup
.
prototype
,{
containerName
:
"editableform"
,
innerCss
:
".editable-inline"
,
containerClass
:
"editable-container editable-inline"
,
initContainer
:
function
(){
this
.
$tip
=
a
(
"<span></span>"
),
this
.
options
.
anim
||
(
this
.
options
.
anim
=
0
)},
splitOptions
:
function
(){
this
.
containerOptions
=
{},
this
.
formOptions
=
this
.
options
},
tip
:
function
(){
return
this
.
$tip
},
innerShow
:
function
(){
this
.
$element
.
hide
(),
this
.
tip
().
insertAfter
(
this
.
$element
).
show
()},
innerHide
:
function
(){
this
.
$tip
.
hide
(
this
.
options
.
anim
,
a
.
proxy
(
function
(){
this
.
$element
.
show
(),
this
.
innerDestroy
()},
this
))},
innerDestroy
:
function
(){
this
.
tip
()
&&
this
.
tip
().
empty
().
remove
()}})}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
b
,
c
){
this
.
$element
=
a
(
b
),
this
.
options
=
a
.
extend
({},
a
.
fn
.
editable
.
defaults
,
c
,
a
.
fn
.
editableutils
.
getConfigData
(
this
.
$element
)),
this
.
options
.
selector
?
this
.
initLive
():
this
.
init
(),
this
.
options
.
highlight
&&!
a
.
fn
.
editableutils
.
supportsTransitions
()
&&
(
this
.
options
.
highlight
=!
1
)};
b
.
prototype
=
{
constructor
:
b
,
init
:
function
(){
var
b
,
c
=!
1
;
if
(
this
.
options
.
name
=
this
.
options
.
name
||
this
.
$element
.
attr
(
"id"
),
this
.
options
.
scope
=
this
.
$element
[
0
],
this
.
input
=
a
.
fn
.
editableutils
.
createInput
(
this
.
options
),
this
.
input
){
switch
(
void
0
===
this
.
options
.
value
||
null
===
this
.
options
.
value
?(
this
.
value
=
this
.
input
.
html2value
(
a
.
trim
(
this
.
$element
.
html
())),
c
=!
0
):(
this
.
options
.
value
=
a
.
fn
.
editableutils
.
tryParseJson
(
this
.
options
.
value
,
!
0
),
this
.
value
=
"string"
==
typeof
this
.
options
.
value
?
this
.
input
.
str2value
(
this
.
options
.
value
):
this
.
options
.
value
),
this
.
$element
.
addClass
(
"editable"
),
"textarea"
===
this
.
input
.
type
&&
this
.
$element
.
addClass
(
"editable-pre-wrapped"
),
"manual"
!==
this
.
options
.
toggle
?(
this
.
$element
.
addClass
(
"editable-click"
),
this
.
$element
.
on
(
this
.
options
.
toggle
+
".editable"
,
a
.
proxy
(
function
(
a
){
if
(
this
.
options
.
disabled
||
a
.
preventDefault
(),
"mouseenter"
===
this
.
options
.
toggle
)
this
.
show
();
else
{
var
b
=
"click"
!==
this
.
options
.
toggle
;
this
.
toggle
(
b
)}},
this
))):
this
.
$element
.
attr
(
"tabindex"
,
-
1
),
"function"
==
typeof
this
.
options
.
display
&&
(
this
.
options
.
autotext
=
"always"
),
this
.
options
.
autotext
){
case
"always"
:
b
=!
0
;
break
;
case
"auto"
:
b
=!
a
.
trim
(
this
.
$element
.
text
()).
length
&&
null
!==
this
.
value
&&
void
0
!==
this
.
value
&&!
c
;
break
;
default
:
b
=!
1
}
a
.
when
(
b
?
this
.
render
():
!
0
).
then
(
a
.
proxy
(
function
(){
this
.
options
.
disabled
?
this
.
disable
():
this
.
enable
(),
this
.
$element
.
triggerHandler
(
"init"
,
this
)},
this
))}},
initLive
:
function
(){
var
b
=
this
.
options
.
selector
;
this
.
options
.
selector
=!
1
,
this
.
options
.
autotext
=
"never"
,
this
.
$element
.
on
(
this
.
options
.
toggle
+
".editable"
,
b
,
a
.
proxy
(
function
(
b
){
var
c
=
a
(
b
.
target
);
c
.
data
(
"editable"
)
||
(
c
.
hasClass
(
this
.
options
.
emptyclass
)
&&
c
.
empty
(),
c
.
editable
(
this
.
options
).
trigger
(
b
))},
this
))},
render
:
function
(
a
){
return
this
.
options
.
display
!==!
1
?
this
.
input
.
value2htmlFinal
?
this
.
input
.
value2html
(
this
.
value
,
this
.
$element
[
0
],
this
.
options
.
display
,
a
):
"function"
==
typeof
this
.
options
.
display
?
this
.
options
.
display
.
call
(
this
.
$element
[
0
],
this
.
value
,
a
):
this
.
input
.
value2html
(
this
.
value
,
this
.
$element
[
0
]):
void
0
},
enable
:
function
(){
this
.
options
.
disabled
=!
1
,
this
.
$element
.
removeClass
(
"editable-disabled"
),
this
.
handleEmpty
(
this
.
isEmpty
),
"manual"
!==
this
.
options
.
toggle
&&
"-1"
===
this
.
$element
.
attr
(
"tabindex"
)
&&
this
.
$element
.
removeAttr
(
"tabindex"
)},
disable
:
function
(){
this
.
options
.
disabled
=!
0
,
this
.
hide
(),
this
.
$element
.
addClass
(
"editable-disabled"
),
this
.
handleEmpty
(
this
.
isEmpty
),
this
.
$element
.
attr
(
"tabindex"
,
-
1
)},
toggleDisabled
:
function
(){
this
.
options
.
disabled
?
this
.
enable
():
this
.
disable
()},
option
:
function
(
b
,
c
){
return
b
&&
"object"
==
typeof
b
?(
a
.
each
(
b
,
a
.
proxy
(
function
(
b
,
c
){
this
.
option
(
a
.
trim
(
b
),
c
)},
this
)),
void
0
):(
this
.
options
[
b
]
=
c
,
"disabled"
===
b
?
c
?
this
.
disable
():
this
.
enable
():(
"value"
===
b
&&
this
.
setValue
(
c
),
this
.
container
&&
this
.
container
.
option
(
b
,
c
),
this
.
input
.
option
&&
this
.
input
.
option
(
b
,
c
),
void
0
))},
handleEmpty
:
function
(
b
){
this
.
options
.
display
!==!
1
&&
(
this
.
isEmpty
=
void
0
!==
b
?
b
:
"function"
==
typeof
this
.
input
.
isEmpty
?
this
.
input
.
isEmpty
(
this
.
$element
):
""
===
a
.
trim
(
this
.
$element
.
html
()),
this
.
options
.
disabled
?
this
.
isEmpty
&&
(
this
.
$element
.
empty
(),
this
.
options
.
emptyclass
&&
this
.
$element
.
removeClass
(
this
.
options
.
emptyclass
)):
this
.
isEmpty
?(
this
.
$element
.
html
(
this
.
options
.
emptytext
),
this
.
options
.
emptyclass
&&
this
.
$element
.
addClass
(
this
.
options
.
emptyclass
)):
this
.
options
.
emptyclass
&&
this
.
$element
.
removeClass
(
this
.
options
.
emptyclass
))},
show
:
function
(
b
){
if
(
!
this
.
options
.
disabled
){
if
(
this
.
container
){
if
(
this
.
container
.
tip
().
is
(
":visible"
))
return
}
else
{
var
c
=
a
.
extend
({},
this
.
options
,{
value
:
this
.
value
,
input
:
this
.
input
});
this
.
$element
.
editableContainer
(
c
),
this
.
$element
.
on
(
"save.internal"
,
a
.
proxy
(
this
.
save
,
this
)),
this
.
container
=
this
.
$element
.
data
(
"editableContainer"
)}
this
.
container
.
show
(
b
)}},
hide
:
function
(){
this
.
container
&&
this
.
container
.
hide
()},
toggle
:
function
(
a
){
this
.
container
&&
this
.
container
.
tip
().
is
(
":visible"
)?
this
.
hide
():
this
.
show
(
a
)},
save
:
function
(
a
,
b
){
if
(
this
.
options
.
unsavedclass
){
var
c
=!
1
;
c
=
c
||
"function"
==
typeof
this
.
options
.
url
,
c
=
c
||
this
.
options
.
display
===!
1
,
c
=
c
||
void
0
!==
b
.
response
,
c
=
c
||
this
.
options
.
savenochange
&&
this
.
input
.
value2str
(
this
.
value
)
!==
this
.
input
.
value2str
(
b
.
newValue
),
c
?
this
.
$element
.
removeClass
(
this
.
options
.
unsavedclass
):
this
.
$element
.
addClass
(
this
.
options
.
unsavedclass
)}
if
(
this
.
options
.
highlight
){
var
d
=
this
.
$element
,
e
=
d
.
css
(
"background-color"
);
d
.
css
(
"background-color"
,
this
.
options
.
highlight
),
setTimeout
(
function
(){
"transparent"
===
e
&&
(
e
=
""
),
d
.
css
(
"background-color"
,
e
),
d
.
addClass
(
"editable-bg-transition"
),
setTimeout
(
function
(){
d
.
removeClass
(
"editable-bg-transition"
)},
1700
)},
10
)}
this
.
setValue
(
b
.
newValue
,
!
1
,
b
.
response
)},
validate
:
function
(){
return
"function"
==
typeof
this
.
options
.
validate
?
this
.
options
.
validate
.
call
(
this
,
this
.
value
):
void
0
},
setValue
:
function
(
b
,
c
,
d
){
this
.
value
=
c
?
this
.
input
.
str2value
(
b
):
b
,
this
.
container
&&
this
.
container
.
option
(
"value"
,
this
.
value
),
a
.
when
(
this
.
render
(
d
)).
then
(
a
.
proxy
(
function
(){
this
.
handleEmpty
()},
this
))},
activate
:
function
(){
this
.
container
&&
this
.
container
.
activate
()},
destroy
:
function
(){
this
.
disable
(),
this
.
container
&&
this
.
container
.
destroy
(),
this
.
input
.
destroy
(),
"manual"
!==
this
.
options
.
toggle
&&
(
this
.
$element
.
removeClass
(
"editable-click"
),
this
.
$element
.
off
(
this
.
options
.
toggle
+
".editable"
)),
this
.
$element
.
off
(
"save.internal"
),
this
.
$element
.
removeClass
(
"editable editable-open editable-disabled"
),
this
.
$element
.
removeData
(
"editable"
)}},
a
.
fn
.
editable
=
function
(
c
){
var
d
=
{},
e
=
arguments
,
f
=
"editable"
;
switch
(
c
){
case
"validate"
:
return
this
.
each
(
function
(){
var
b
,
c
=
a
(
this
),
e
=
c
.
data
(
f
);
e
&&
(
b
=
e
.
validate
())
&&
(
d
[
e
.
options
.
name
]
=
b
)}),
d
;
case
"getValue"
:
return
2
===
arguments
.
length
&&
arguments
[
1
]
===!
0
?
d
=
this
.
eq
(
0
).
data
(
f
).
value
:
this
.
each
(
function
(){
var
b
=
a
(
this
),
c
=
b
.
data
(
f
);
c
&&
void
0
!==
c
.
value
&&
null
!==
c
.
value
&&
(
d
[
c
.
options
.
name
]
=
c
.
input
.
value2submit
(
c
.
value
))}),
d
;
case
"submit"
:
var
g
=
arguments
[
1
]
||
{},
h
=
this
,
i
=
this
.
editable
(
"validate"
);
if
(
a
.
isEmptyObject
(
i
)){
var
j
=
{};
if
(
1
===
h
.
length
){
var
k
=
h
.
data
(
"editable"
),
l
=
{
name
:
k
.
options
.
name
||
""
,
value
:
k
.
input
.
value2submit
(
k
.
value
),
pk
:
"function"
==
typeof
k
.
options
.
pk
?
k
.
options
.
pk
.
call
(
k
.
options
.
scope
):
k
.
options
.
pk
};
"function"
==
typeof
k
.
options
.
params
?
l
=
k
.
options
.
params
.
call
(
k
.
options
.
scope
,
l
):(
k
.
options
.
params
=
a
.
fn
.
editableutils
.
tryParseJson
(
k
.
options
.
params
,
!
0
),
a
.
extend
(
l
,
k
.
options
.
params
)),
j
=
{
url
:
k
.
options
.
url
,
data
:
l
,
type
:
"POST"
},
g
.
success
=
g
.
success
||
k
.
options
.
success
,
g
.
error
=
g
.
error
||
k
.
options
.
error
}
else
{
var
m
=
this
.
editable
(
"getValue"
);
j
=
{
url
:
g
.
url
,
data
:
m
,
type
:
"POST"
}}
j
.
success
=
"function"
==
typeof
g
.
success
?
function
(
a
){
g
.
success
.
call
(
h
,
a
,
g
)}:
a
.
noop
,
j
.
error
=
"function"
==
typeof
g
.
error
?
function
(){
g
.
error
.
apply
(
h
,
arguments
)}:
a
.
noop
,
g
.
ajaxOptions
&&
a
.
extend
(
j
,
g
.
ajaxOptions
),
g
.
data
&&
a
.
extend
(
j
.
data
,
g
.
data
),
a
.
ajax
(
j
)}
else
"function"
==
typeof
g
.
error
&&
g
.
error
.
call
(
h
,
i
);
return
this
}
return
this
.
each
(
function
(){
var
d
=
a
(
this
),
g
=
d
.
data
(
f
),
h
=
"object"
==
typeof
c
&&
c
;
return
h
&&
h
.
selector
?(
g
=
new
b
(
this
,
h
),
void
0
):(
g
||
d
.
data
(
f
,
g
=
new
b
(
this
,
h
)),
"string"
==
typeof
c
&&
g
[
c
].
apply
(
g
,
Array
.
prototype
.
slice
.
call
(
e
,
1
)),
void
0
)})},
a
.
fn
.
editable
.
defaults
=
{
type
:
"text"
,
disabled
:
!
1
,
toggle
:
"click"
,
emptytext
:
"Empty"
,
autotext
:
"auto"
,
value
:
null
,
display
:
null
,
emptyclass
:
"editable-empty"
,
unsavedclass
:
"editable-unsaved"
,
selector
:
null
,
highlight
:
"#FFFF80"
}}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
fn
.
editabletypes
=
{};
var
b
=
function
(){};
b
.
prototype
=
{
init
:
function
(
b
,
c
,
d
){
this
.
type
=
b
,
this
.
options
=
a
.
extend
({},
d
,
c
)},
prerender
:
function
(){
this
.
$tpl
=
a
(
this
.
options
.
tpl
),
this
.
$input
=
this
.
$tpl
,
this
.
$clear
=
null
,
this
.
error
=
null
},
render
:
function
(){},
value2html
:
function
(
b
,
c
){
a
(
c
)[
this
.
options
.
escape
?
"text"
:
"html"
](
a
.
trim
(
b
))},
html2value
:
function
(
b
){
return
a
(
"<div>"
).
html
(
b
).
text
()},
value2str
:
function
(
a
){
return
a
},
str2value
:
function
(
a
){
return
a
},
value2submit
:
function
(
a
){
return
a
},
value2input
:
function
(
a
){
this
.
$input
.
val
(
a
)},
input2value
:
function
(){
return
this
.
$input
.
val
()},
activate
:
function
(){
this
.
$input
.
is
(
":visible"
)
&&
this
.
$input
.
focus
()},
clear
:
function
(){
this
.
$input
.
val
(
null
)},
escape
:
function
(
b
){
return
a
(
"<div>"
).
text
(
b
).
html
()},
autosubmit
:
function
(){},
destroy
:
function
(){},
setClass
:
function
(){
this
.
options
.
inputclass
&&
this
.
$input
.
addClass
(
this
.
options
.
inputclass
)},
setAttr
:
function
(
a
){
void
0
!==
this
.
options
[
a
]
&&
null
!==
this
.
options
[
a
]
&&
this
.
$input
.
attr
(
a
,
this
.
options
[
a
])},
option
:
function
(
a
,
b
){
this
.
options
[
a
]
=
b
}},
b
.
defaults
=
{
tpl
:
""
,
inputclass
:
null
,
escape
:
!
0
,
scope
:
null
,
showbuttons
:
!
0
},
a
.
extend
(
a
.
fn
.
editabletypes
,{
abstractinput
:
b
})}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(){};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
var
b
=
a
.
Deferred
();
return
this
.
error
=
null
,
this
.
onSourceReady
(
function
(){
this
.
renderList
(),
b
.
resolve
()},
function
(){
this
.
error
=
this
.
options
.
sourceError
,
b
.
resolve
()}),
b
.
promise
()},
html2value
:
function
(){
return
null
},
value2html
:
function
(
b
,
c
,
d
,
e
){
var
f
=
a
.
Deferred
(),
g
=
function
(){
"function"
==
typeof
d
?
d
.
call
(
c
,
b
,
this
.
sourceData
,
e
):
this
.
value2htmlFinal
(
b
,
c
),
f
.
resolve
()};
return
null
===
b
?
g
.
call
(
this
):
this
.
onSourceReady
(
g
,
function
(){
f
.
resolve
()}),
f
.
promise
()},
onSourceReady
:
function
(
b
,
c
){
var
d
;
if
(
a
.
isFunction
(
this
.
options
.
source
)?(
d
=
this
.
options
.
source
.
call
(
this
.
options
.
scope
),
this
.
sourceData
=
null
):
d
=
this
.
options
.
source
,
this
.
options
.
sourceCache
&&
a
.
isArray
(
this
.
sourceData
))
return
b
.
call
(
this
),
void
0
;
try
{
d
=
a
.
fn
.
editableutils
.
tryParseJson
(
d
,
!
1
)}
catch
(
e
){
return
c
.
call
(
this
),
void
0
}
if
(
"string"
==
typeof
d
){
if
(
this
.
options
.
sourceCache
){
var
f
,
g
=
d
;
if
(
a
(
document
).
data
(
g
)
||
a
(
document
).
data
(
g
,{}),
f
=
a
(
document
).
data
(
g
),
f
.
loading
===!
1
&&
f
.
sourceData
)
return
this
.
sourceData
=
f
.
sourceData
,
this
.
doPrepend
(),
b
.
call
(
this
),
void
0
;
if
(
f
.
loading
===!
0
)
return
f
.
callbacks
.
push
(
a
.
proxy
(
function
(){
this
.
sourceData
=
f
.
sourceData
,
this
.
doPrepend
(),
b
.
call
(
this
)},
this
)),
f
.
err_callbacks
.
push
(
a
.
proxy
(
c
,
this
)),
void
0
;
f
.
loading
=!
0
,
f
.
callbacks
=
[],
f
.
err_callbacks
=
[]}
var
h
=
a
.
extend
({
url
:
d
,
type
:
"get"
,
cache
:
!
1
,
dataType
:
"json"
,
success
:
a
.
proxy
(
function
(
d
){
f
&&
(
f
.
loading
=!
1
),
this
.
sourceData
=
this
.
makeArray
(
d
),
a
.
isArray
(
this
.
sourceData
)?(
f
&&
(
f
.
sourceData
=
this
.
sourceData
,
a
.
each
(
f
.
callbacks
,
function
(){
this
.
call
()})),
this
.
doPrepend
(),
b
.
call
(
this
)):(
c
.
call
(
this
),
f
&&
a
.
each
(
f
.
err_callbacks
,
function
(){
this
.
call
()}))},
this
),
error
:
a
.
proxy
(
function
(){
c
.
call
(
this
),
f
&&
(
f
.
loading
=!
1
,
a
.
each
(
f
.
err_callbacks
,
function
(){
this
.
call
()}))},
this
)},
this
.
options
.
sourceOptions
);
a
.
ajax
(
h
)}
else
this
.
sourceData
=
this
.
makeArray
(
d
),
a
.
isArray
(
this
.
sourceData
)?(
this
.
doPrepend
(),
b
.
call
(
this
)):
c
.
call
(
this
)},
doPrepend
:
function
(){
null
!==
this
.
options
.
prepend
&&
void
0
!==
this
.
options
.
prepend
&&
(
a
.
isArray
(
this
.
prependData
)
||
(
a
.
isFunction
(
this
.
options
.
prepend
)
&&
(
this
.
options
.
prepend
=
this
.
options
.
prepend
.
call
(
this
.
options
.
scope
)),
this
.
options
.
prepend
=
a
.
fn
.
editableutils
.
tryParseJson
(
this
.
options
.
prepend
,
!
0
),
"string"
==
typeof
this
.
options
.
prepend
&&
(
this
.
options
.
prepend
=
{
""
:
this
.
options
.
prepend
}),
this
.
prependData
=
this
.
makeArray
(
this
.
options
.
prepend
)),
a
.
isArray
(
this
.
prependData
)
&&
a
.
isArray
(
this
.
sourceData
)
&&
(
this
.
sourceData
=
this
.
prependData
.
concat
(
this
.
sourceData
)))},
renderList
:
function
(){},
value2htmlFinal
:
function
(){},
makeArray
:
function
(
b
){
var
c
,
d
,
e
,
f
,
g
=
[];
if
(
!
b
||
"string"
==
typeof
b
)
return
null
;
if
(
a
.
isArray
(
b
)){
f
=
function
(
a
,
b
){
return
d
=
{
value
:
a
,
text
:
b
},
c
++>=
2
?
!
1
:
void
0
};
for
(
var
h
=
0
;
h
<
b
.
length
;
h
++
)
e
=
b
[
h
],
"object"
==
typeof
e
?(
c
=
0
,
a
.
each
(
e
,
f
),
1
===
c
?
g
.
push
(
d
):
c
>
1
&&
(
e
.
children
&&
(
e
.
children
=
this
.
makeArray
(
e
.
children
)),
g
.
push
(
e
))):
g
.
push
({
value
:
e
,
text
:
e
})}
else
a
.
each
(
b
,
function
(
a
,
b
){
g
.
push
({
value
:
a
,
text
:
b
})});
return
g
},
option
:
function
(
a
,
b
){
this
.
options
[
a
]
=
b
,
"source"
===
a
&&
(
this
.
sourceData
=
null
),
"prepend"
===
a
&&
(
this
.
prependData
=
null
)}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
source
:
null
,
prepend
:
!
1
,
sourceError
:
"Error when loading list"
,
sourceCache
:
!
0
,
sourceOptions
:
null
}),
a
.
fn
.
editabletypes
.
list
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"text"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
renderClear
(),
this
.
setClass
(),
this
.
setAttr
(
"placeholder"
)},
activate
:
function
(){
this
.
$input
.
is
(
":visible"
)
&&
(
this
.
$input
.
focus
(),
a
.
fn
.
editableutils
.
setCursorPosition
(
this
.
$input
.
get
(
0
),
this
.
$input
.
val
().
length
),
this
.
toggleClear
&&
this
.
toggleClear
())},
renderClear
:
function
(){
this
.
options
.
clear
&&
(
this
.
$clear
=
a
(
'<span class="editable-clear-x"></span>'
),
this
.
$input
.
after
(
this
.
$clear
).
css
(
"padding-right"
,
24
).
keyup
(
a
.
proxy
(
function
(
b
){
if
(
!~
a
.
inArray
(
b
.
keyCode
,[
40
,
38
,
9
,
13
,
27
])){
clearTimeout
(
this
.
t
);
var
c
=
this
;
this
.
t
=
setTimeout
(
function
(){
c
.
toggleClear
(
b
)},
100
)}},
this
)).
parent
().
css
(
"position"
,
"relative"
),
this
.
$clear
.
click
(
a
.
proxy
(
this
.
clear
,
this
)))},
postrender
:
function
(){},
toggleClear
:
function
(){
if
(
this
.
$clear
){
var
a
=
this
.
$input
.
val
().
length
,
b
=
this
.
$clear
.
is
(
":visible"
);
a
&&!
b
&&
this
.
$clear
.
show
(),
!
a
&&
b
&&
this
.
$clear
.
hide
()}},
clear
:
function
(){
this
.
$clear
.
hide
(),
this
.
$input
.
val
(
""
).
focus
()}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<input type="text">'
,
placeholder
:
null
,
clear
:
!
0
}),
a
.
fn
.
editabletypes
.
text
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"textarea"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
setClass
(),
this
.
setAttr
(
"placeholder"
),
this
.
setAttr
(
"rows"
),
this
.
$input
.
keydown
(
function
(
b
){
b
.
ctrlKey
&&
13
===
b
.
which
&&
a
(
this
).
closest
(
"form"
).
submit
()})},
activate
:
function
(){
a
.
fn
.
editabletypes
.
text
.
prototype
.
activate
.
call
(
this
)}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
"<textarea></textarea>"
,
inputclass
:
"input-large"
,
placeholder
:
null
,
rows
:
7
}),
a
.
fn
.
editabletypes
.
textarea
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"select"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
list
),
a
.
extend
(
b
.
prototype
,{
renderList
:
function
(){
this
.
$input
.
empty
();
var
b
=
function
(
c
,
d
){
var
e
;
if
(
a
.
isArray
(
d
))
for
(
var
f
=
0
;
f
<
d
.
length
;
f
++
)
e
=
{},
d
[
f
].
children
?(
e
.
label
=
d
[
f
].
text
,
c
.
append
(
b
(
a
(
"<optgroup>"
,
e
),
d
[
f
].
children
))):(
e
.
value
=
d
[
f
].
value
,
d
[
f
].
disabled
&&
(
e
.
disabled
=!
0
),
c
.
append
(
a
(
"<option>"
,
e
).
text
(
d
[
f
].
text
)));
return
c
};
b
(
this
.
$input
,
this
.
sourceData
),
this
.
setClass
(),
this
.
$input
.
on
(
"keydown.editable"
,
function
(
b
){
13
===
b
.
which
&&
a
(
this
).
closest
(
"form"
).
submit
()})},
value2htmlFinal
:
function
(
b
,
c
){
var
d
=
""
,
e
=
a
.
fn
.
editableutils
.
itemsByValue
(
b
,
this
.
sourceData
);
e
.
length
&&
(
d
=
e
[
0
].
text
),
a
.
fn
.
editabletypes
.
abstractinput
.
prototype
.
value2html
.
call
(
this
,
d
,
c
)},
autosubmit
:
function
(){
this
.
$input
.
off
(
"keydown.editable"
).
on
(
"change.editable"
,
function
(){
a
(
this
).
closest
(
"form"
).
submit
()})}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
list
.
defaults
,{
tpl
:
"<select></select>"
}),
a
.
fn
.
editabletypes
.
select
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"checklist"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
list
),
a
.
extend
(
b
.
prototype
,{
renderList
:
function
(){
var
b
;
if
(
this
.
$tpl
.
empty
(),
a
.
isArray
(
this
.
sourceData
)){
for
(
var
c
=
0
;
c
<
this
.
sourceData
.
length
;
c
++
)
b
=
a
(
"<label>"
).
append
(
a
(
"<input>"
,{
type
:
"checkbox"
,
value
:
this
.
sourceData
[
c
].
value
})).
append
(
a
(
"<span>"
).
text
(
" "
+
this
.
sourceData
[
c
].
text
)),
a
(
"<div>"
).
append
(
b
).
appendTo
(
this
.
$tpl
);
this
.
$input
=
this
.
$tpl
.
find
(
'input[type="checkbox"]'
),
this
.
setClass
()}},
value2str
:
function
(
b
){
return
a
.
isArray
(
b
)?
b
.
sort
().
join
(
a
.
trim
(
this
.
options
.
separator
)):
""
},
str2value
:
function
(
b
){
var
c
,
d
=
null
;
return
"string"
==
typeof
b
&&
b
.
length
?(
c
=
new
RegExp
(
"
\\
s*"
+
a
.
trim
(
this
.
options
.
separator
)
+
"
\\
s*"
),
d
=
b
.
split
(
c
)):
d
=
a
.
isArray
(
b
)?
b
:[
b
],
d
},
value2input
:
function
(
b
){
this
.
$input
.
prop
(
"checked"
,
!
1
),
a
.
isArray
(
b
)
&&
b
.
length
&&
this
.
$input
.
each
(
function
(
c
,
d
){
var
e
=
a
(
d
);
a
.
each
(
b
,
function
(
a
,
b
){
e
.
val
()
==
b
&&
e
.
prop
(
"checked"
,
!
0
)})})},
input2value
:
function
(){
var
b
=
[];
return
this
.
$input
.
filter
(
":checked"
).
each
(
function
(
c
,
d
){
b
.
push
(
a
(
d
).
val
())}),
b
},
value2htmlFinal
:
function
(
b
,
c
){
var
d
=
[],
e
=
a
.
fn
.
editableutils
.
itemsByValue
(
b
,
this
.
sourceData
),
f
=
this
.
options
.
escape
;
e
.
length
?(
a
.
each
(
e
,
function
(
b
,
c
){
var
e
=
f
?
a
.
fn
.
editableutils
.
escape
(
c
.
text
):
c
.
text
;
d
.
push
(
e
)}),
a
(
c
).
html
(
d
.
join
(
"<br>"
))):
a
(
c
).
empty
()},
activate
:
function
(){
this
.
$input
.
first
().
focus
()},
autosubmit
:
function
(){
this
.
$input
.
on
(
"keydown"
,
function
(
b
){
13
===
b
.
which
&&
a
(
this
).
closest
(
"form"
).
submit
()})}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
list
.
defaults
,{
tpl
:
'<div class="editable-checklist"></div>'
,
inputclass
:
null
,
separator
:
","
}),
a
.
fn
.
editabletypes
.
checklist
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"password"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
a
.
extend
(
b
.
prototype
,{
value2html
:
function
(
b
,
c
){
b
?
a
(
c
).
text
(
"[hidden]"
):
a
(
c
).
empty
()},
html2value
:
function
(){
return
null
}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="password">'
}),
a
.
fn
.
editabletypes
.
password
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"email"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="email">'
}),
a
.
fn
.
editabletypes
.
email
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"url"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="url">'
}),
a
.
fn
.
editabletypes
.
url
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"tel"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="tel">'
}),
a
.
fn
.
editabletypes
.
tel
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"number"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
b
.
superclass
.
render
.
call
(
this
),
this
.
setAttr
(
"min"
),
this
.
setAttr
(
"max"
),
this
.
setAttr
(
"step"
)},
postrender
:
function
(){
this
.
$clear
&&
this
.
$clear
.
css
({
right
:
24
})}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="number">'
,
inputclass
:
"input-mini"
,
min
:
null
,
max
:
null
,
step
:
null
}),
a
.
fn
.
editabletypes
.
number
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"range"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
number
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
$input
=
this
.
$tpl
.
filter
(
"input"
),
this
.
setClass
(),
this
.
setAttr
(
"min"
),
this
.
setAttr
(
"max"
),
this
.
setAttr
(
"step"
),
this
.
$input
.
on
(
"input"
,
function
(){
a
(
this
).
siblings
(
"output"
).
text
(
a
(
this
).
val
())})},
activate
:
function
(){
this
.
$input
.
focus
()}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
number
.
defaults
,{
tpl
:
'<input type="range"><output style="width: 30px; display: inline-block"></output>'
,
inputclass
:
"input-medium"
}),
a
.
fn
.
editabletypes
.
range
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"time"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
setClass
()}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<input type="time">'
}),
a
.
fn
.
editabletypes
.
time
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
c
){
if
(
this
.
init
(
"select2"
,
c
,
b
.
defaults
),
c
.
select2
=
c
.
select2
||
{},
this
.
sourceData
=
null
,
c
.
placeholder
&&
(
c
.
select2
.
placeholder
=
c
.
placeholder
),
!
c
.
select2
.
tags
&&
c
.
source
){
var
d
=
c
.
source
;
a
.
isFunction
(
c
.
source
)
&&
(
d
=
c
.
source
.
call
(
c
.
scope
)),
"string"
==
typeof
d
?(
c
.
select2
.
ajax
=
c
.
select2
.
ajax
||
{},
c
.
select2
.
ajax
.
data
||
(
c
.
select2
.
ajax
.
data
=
function
(
a
){
return
{
query
:
a
}}),
c
.
select2
.
ajax
.
results
||
(
c
.
select2
.
ajax
.
results
=
function
(
a
){
return
{
results
:
a
}}),
c
.
select2
.
ajax
.
url
=
d
):(
this
.
sourceData
=
this
.
convertSource
(
d
),
c
.
select2
.
data
=
this
.
sourceData
)}
if
(
this
.
options
.
select2
=
a
.
extend
({},
b
.
defaults
.
select2
,
c
.
select2
),
this
.
isMultiple
=
this
.
options
.
select2
.
tags
||
this
.
options
.
select2
.
multiple
,
this
.
isRemote
=
"ajax"
in
this
.
options
.
select2
,
this
.
idFunc
=
this
.
options
.
select2
.
id
,
"function"
!=
typeof
this
.
idFunc
){
var
e
=
this
.
idFunc
||
"id"
;
this
.
idFunc
=
function
(
a
){
return
a
[
e
]}}
this
.
formatSelection
=
this
.
options
.
select2
.
formatSelection
,
"function"
!=
typeof
this
.
formatSelection
&&
(
this
.
formatSelection
=
function
(
a
){
return
a
.
text
})};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
setClass
(),
this
.
isRemote
&&
this
.
$input
.
on
(
"select2-loaded"
,
a
.
proxy
(
function
(
a
){
this
.
sourceData
=
a
.
items
.
results
},
this
)),
this
.
isMultiple
&&
this
.
$input
.
on
(
"change"
,
function
(){
a
(
this
).
closest
(
"form"
).
parent
().
triggerHandler
(
"resize"
)})},
value2html
:
function
(
c
,
d
){
var
e
,
f
=
""
,
g
=
this
;
this
.
options
.
select2
.
tags
?
e
=
c
:
this
.
sourceData
&&
(
e
=
a
.
fn
.
editableutils
.
itemsByValue
(
c
,
this
.
sourceData
,
this
.
idFunc
)),
a
.
isArray
(
e
)?(
f
=
[],
a
.
each
(
e
,
function
(
a
,
b
){
f
.
push
(
b
&&
"object"
==
typeof
b
?
g
.
formatSelection
(
b
):
b
)})):
e
&&
(
f
=
g
.
formatSelection
(
e
)),
f
=
a
.
isArray
(
f
)?
f
.
join
(
this
.
options
.
viewseparator
):
f
,
b
.
superclass
.
value2html
.
call
(
this
,
f
,
d
)},
html2value
:
function
(
a
){
return
this
.
options
.
select2
.
tags
?
this
.
str2value
(
a
,
this
.
options
.
viewseparator
):
null
},
value2input
:
function
(
b
){
if
(
a
.
isArray
(
b
)
&&
(
b
=
b
.
join
(
this
.
getSeparator
())),
this
.
$input
.
data
(
"select2"
)?
this
.
$input
.
val
(
b
).
trigger
(
"change"
,
!
0
):(
this
.
$input
.
val
(
b
),
this
.
$input
.
select2
(
this
.
options
.
select2
)),
this
.
isRemote
&&!
this
.
isMultiple
&&!
this
.
options
.
select2
.
initSelection
){
var
c
=
this
.
options
.
select2
.
id
,
d
=
this
.
options
.
select2
.
formatSelection
;
if
(
!
c
&&!
d
){
var
e
=
a
(
this
.
options
.
scope
);
if
(
!
e
.
data
(
"editable"
).
isEmpty
){
var
f
=
{
id
:
b
,
text
:
e
.
text
()};
this
.
$input
.
select2
(
"data"
,
f
)}}}},
input2value
:
function
(){
return
this
.
$input
.
select2
(
"val"
)},
str2value
:
function
(
b
,
c
){
if
(
"string"
!=
typeof
b
||!
this
.
isMultiple
)
return
b
;
c
=
c
||
this
.
getSeparator
();
var
d
,
e
,
f
;
if
(
null
===
b
||
b
.
length
<
1
)
return
null
;
for
(
d
=
b
.
split
(
c
),
e
=
0
,
f
=
d
.
length
;
f
>
e
;
e
+=
1
)
d
[
e
]
=
a
.
trim
(
d
[
e
]);
return
d
},
autosubmit
:
function
(){
this
.
$input
.
on
(
"change"
,
function
(
b
,
c
){
c
||
a
(
this
).
closest
(
"form"
).
submit
()})},
getSeparator
:
function
(){
return
this
.
options
.
select2
.
separator
||
a
.
fn
.
select2
.
defaults
.
separator
},
convertSource
:
function
(
b
){
if
(
a
.
isArray
(
b
)
&&
b
.
length
&&
void
0
!==
b
[
0
].
value
)
for
(
var
c
=
0
;
c
<
b
.
length
;
c
++
)
void
0
!==
b
[
c
].
value
&&
(
b
[
c
].
id
=
b
[
c
].
value
,
delete
b
[
c
].
value
);
return
b
},
destroy
:
function
(){
this
.
$input
.
data
(
"select2"
)
&&
this
.
$input
.
select2
(
"destroy"
)}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<input type="hidden">'
,
select2
:
null
,
placeholder
:
null
,
source
:
null
,
viewseparator
:
", "
}),
a
.
fn
.
editabletypes
.
select2
=
b
}(
window
.
jQuery
),
function
(
a
){
var
b
=
function
(
b
,
c
){
return
this
.
$element
=
a
(
b
),
this
.
$element
.
is
(
"input"
)?(
this
.
options
=
a
.
extend
({},
a
.
fn
.
combodate
.
defaults
,
c
,
this
.
$element
.
data
()),
this
.
init
(),
void
0
):(
a
.
error
(
"Combodate should be applied to INPUT element"
),
void
0
)};
b
.
prototype
=
{
constructor
:
b
,
init
:
function
(){
this
.
map
=
{
day
:[
"D"
,
"date"
],
month
:[
"M"
,
"month"
],
year
:[
"Y"
,
"year"
],
hour
:[
"[Hh]"
,
"hours"
],
minute
:[
"m"
,
"minutes"
],
second
:[
"s"
,
"seconds"
],
ampm
:[
"[Aa]"
,
""
]},
this
.
$widget
=
a
(
'<span class="combodate"></span>'
).
html
(
this
.
getTemplate
()),
this
.
initCombos
(),
this
.
$widget
.
on
(
"change"
,
"select"
,
a
.
proxy
(
function
(
b
){
this
.
$element
.
val
(
this
.
getValue
()).
change
(),
this
.
options
.
smartDays
&&
(
a
(
b
.
target
).
is
(
".month"
)
||
a
(
b
.
target
).
is
(
".year"
))
&&
this
.
fillCombo
(
"day"
)},
this
)),
this
.
$widget
.
find
(
"select"
).
css
(
"width"
,
"auto"
),
this
.
$element
.
hide
().
after
(
this
.
$widget
),
this
.
setValue
(
this
.
$element
.
val
()
||
this
.
options
.
value
)},
getTemplate
:
function
(){
var
b
=
this
.
options
.
template
;
return
a
.
each
(
this
.
map
,
function
(
a
,
c
){
c
=
c
[
0
];
var
d
=
new
RegExp
(
c
+
"+"
),
e
=
c
.
length
>
1
?
c
.
substring
(
1
,
2
):
c
;
b
=
b
.
replace
(
d
,
"{"
+
e
+
"}"
)}),
b
=
b
.
replace
(
/ /g
,
" "
),
a
.
each
(
this
.
map
,
function
(
a
,
c
){
c
=
c
[
0
];
var
d
=
c
.
length
>
1
?
c
.
substring
(
1
,
2
):
c
;
b
=
b
.
replace
(
"{"
+
d
+
"}"
,
'<select class="'
+
a
+
'"></select>'
)}),
b
},
initCombos
:
function
(){
for
(
var
a
in
this
.
map
){
var
b
=
this
.
$widget
.
find
(
"."
+
a
);
this
[
"$"
+
a
]
=
b
.
length
?
b
:
null
,
this
.
fillCombo
(
a
)}},
fillCombo
:
function
(
a
){
var
b
=
this
[
"$"
+
a
];
if
(
b
){
var
c
=
"fill"
+
a
.
charAt
(
0
).
toUpperCase
()
+
a
.
slice
(
1
),
d
=
this
[
c
](),
e
=
b
.
val
();
b
.
empty
();
for
(
var
f
=
0
;
f
<
d
.
length
;
f
++
)
b
.
append
(
'<option value="'
+
d
[
f
][
0
]
+
'">'
+
d
[
f
][
1
]
+
"</option>"
);
b
.
val
(
e
)}},
fillCommon
:
function
(
a
){
var
b
,
c
=
[];
if
(
"name"
===
this
.
options
.
firstItem
){
b
=
moment
.
relativeTime
||
moment
.
langData
().
_relativeTime
;
var
d
=
"function"
==
typeof
b
[
a
]?
b
[
a
](
1
,
!
0
,
a
,
!
1
):
b
[
a
];
d
=
d
.
split
(
" "
).
reverse
()[
0
],
c
.
push
([
""
,
d
])}
else
"empty"
===
this
.
options
.
firstItem
&&
c
.
push
([
""
,
""
]);
return
c
},
fillDay
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"d"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"DD"
),
e
=
31
;
if
(
this
.
options
.
smartDays
&&
this
.
$month
&&
this
.
$year
){
var
f
=
parseInt
(
this
.
$month
.
val
(),
10
),
g
=
parseInt
(
this
.
$year
.
val
(),
10
);
isNaN
(
f
)
||
isNaN
(
g
)
||
(
e
=
moment
([
g
,
f
]).
daysInMonth
())}
for
(
b
=
1
;
e
>=
b
;
b
++
)
a
=
d
?
this
.
leadZero
(
b
):
b
,
c
.
push
([
b
,
a
]);
return
c
},
fillMonth
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"M"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"MMMM"
),
e
=-
1
!==
this
.
options
.
template
.
indexOf
(
"MMM"
),
f
=-
1
!==
this
.
options
.
template
.
indexOf
(
"MM"
);
for
(
b
=
0
;
11
>=
b
;
b
++
)
a
=
d
?
moment
().
date
(
1
).
month
(
b
).
format
(
"MMMM"
):
e
?
moment
().
date
(
1
).
month
(
b
).
format
(
"MMM"
):
f
?
this
.
leadZero
(
b
+
1
):
b
+
1
,
c
.
push
([
b
,
a
]);
return
c
},
fillYear
:
function
(){
var
a
,
b
,
c
=
[],
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"YYYY"
);
for
(
b
=
this
.
options
.
maxYear
;
b
>=
this
.
options
.
minYear
;
b
--
)
a
=
d
?
b
:(
b
+
""
).
substring
(
2
),
c
[
this
.
options
.
yearDescending
?
"push"
:
"unshift"
]([
b
,
a
]);
return
c
=
this
.
fillCommon
(
"y"
).
concat
(
c
)},
fillHour
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"h"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"h"
),
e
=
(
-
1
!==
this
.
options
.
template
.
indexOf
(
"H"
),
-
1
!==
this
.
options
.
template
.
toLowerCase
().
indexOf
(
"hh"
)),
f
=
d
?
1
:
0
,
g
=
d
?
12
:
23
;
for
(
b
=
f
;
g
>=
b
;
b
++
)
a
=
e
?
this
.
leadZero
(
b
):
b
,
c
.
push
([
b
,
a
]);
return
c
},
fillMinute
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"m"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"mm"
);
for
(
b
=
0
;
59
>=
b
;
b
+=
this
.
options
.
minuteStep
)
a
=
d
?
this
.
leadZero
(
b
):
b
,
c
.
push
([
b
,
a
]);
return
c
},
fillSecond
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"s"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"ss"
);
for
(
b
=
0
;
59
>=
b
;
b
+=
this
.
options
.
secondStep
)
a
=
d
?
this
.
leadZero
(
b
):
b
,
c
.
push
([
b
,
a
]);
return
c
},
fillAmpm
:
function
(){
var
a
=-
1
!==
this
.
options
.
template
.
indexOf
(
"a"
),
b
=
(
-
1
!==
this
.
options
.
template
.
indexOf
(
"A"
),[[
"am"
,
a
?
"am"
:
"AM"
],[
"pm"
,
a
?
"pm"
:
"PM"
]]);
return
b
},
getValue
:
function
(
b
){
var
c
,
d
=
{},
e
=
this
,
f
=!
1
;
return
a
.
each
(
this
.
map
,
function
(
a
){
if
(
"ampm"
!==
a
){
var
b
=
"day"
===
a
?
1
:
0
;
return
d
[
a
]
=
e
[
"$"
+
a
]?
parseInt
(
e
[
"$"
+
a
].
val
(),
10
):
b
,
isNaN
(
d
[
a
])?(
f
=!
0
,
!
1
):
void
0
}}),
f
?
""
:(
this
.
$ampm
&&
(
d
.
hour
=
12
===
d
.
hour
?
"am"
===
this
.
$ampm
.
val
()?
0
:
12
:
"am"
===
this
.
$ampm
.
val
()?
d
.
hour
:
d
.
hour
+
12
),
c
=
moment
([
d
.
year
,
d
.
month
,
d
.
day
,
d
.
hour
,
d
.
minute
,
d
.
second
]),
this
.
highlight
(
c
),
b
=
void
0
===
b
?
this
.
options
.
format
:
b
,
null
===
b
?
c
.
isValid
()?
c
:
null
:
c
.
isValid
()?
c
.
format
(
b
):
""
)},
setValue
:
function
(
b
){
function
c
(
b
,
c
){
var
d
=
{};
return
b
.
children
(
"option"
).
each
(
function
(
b
,
e
){
var
f
,
g
=
a
(
e
).
attr
(
"value"
);
""
!==
g
&&
(
f
=
Math
.
abs
(
g
-
c
),(
"undefined"
==
typeof
d
.
distance
||
f
<
d
.
distance
)
&&
(
d
=
{
value
:
g
,
distance
:
f
}))}),
d
.
value
}
if
(
b
){
var
d
=
"string"
==
typeof
b
?
moment
(
b
,
this
.
options
.
format
):
moment
(
b
),
e
=
this
,
f
=
{};
d
.
isValid
()
&&
(
a
.
each
(
this
.
map
,
function
(
a
,
b
){
"ampm"
!==
a
&&
(
f
[
a
]
=
d
[
b
[
1
]]())}),
this
.
$ampm
&&
(
f
.
hour
>=
12
?(
f
.
ampm
=
"pm"
,
f
.
hour
>
12
&&
(
f
.
hour
-=
12
)):(
f
.
ampm
=
"am"
,
0
===
f
.
hour
&&
(
f
.
hour
=
12
))),
a
.
each
(
f
,
function
(
a
,
b
){
e
[
"$"
+
a
]
&&
(
"minute"
===
a
&&
e
.
options
.
minuteStep
>
1
&&
e
.
options
.
roundTime
&&
(
b
=
c
(
e
[
"$"
+
a
],
b
)),
"second"
===
a
&&
e
.
options
.
secondStep
>
1
&&
e
.
options
.
roundTime
&&
(
b
=
c
(
e
[
"$"
+
a
],
b
)),
e
[
"$"
+
a
].
val
(
b
))}),
this
.
options
.
smartDays
&&
this
.
fillCombo
(
"day"
),
this
.
$element
.
val
(
d
.
format
(
this
.
options
.
format
)).
change
())}},
highlight
:
function
(
a
){
a
.
isValid
()?
this
.
options
.
errorClass
?
this
.
$widget
.
removeClass
(
this
.
options
.
errorClass
):
this
.
$widget
.
find
(
"select"
).
css
(
"border-color"
,
this
.
borderColor
):
this
.
options
.
errorClass
?
this
.
$widget
.
addClass
(
this
.
options
.
errorClass
):(
this
.
borderColor
||
(
this
.
borderColor
=
this
.
$widget
.
find
(
"select"
).
css
(
"border-color"
)),
this
.
$widget
.
find
(
"select"
).
css
(
"border-color"
,
"red"
))},
leadZero
:
function
(
a
){
return
9
>=
a
?
"0"
+
a
:
a
},
destroy
:
function
(){
this
.
$widget
.
remove
(),
this
.
$element
.
removeData
(
"combodate"
).
show
()}},
a
.
fn
.
combodate
=
function
(
c
){
var
d
,
e
=
Array
.
apply
(
null
,
arguments
);
return
e
.
shift
(),
"getValue"
===
c
&&
this
.
length
&&
(
d
=
this
.
eq
(
0
).
data
(
"combodate"
))?
d
.
getValue
.
apply
(
d
,
e
):
this
.
each
(
function
(){
var
d
=
a
(
this
),
f
=
d
.
data
(
"combodate"
),
g
=
"object"
==
typeof
c
&&
c
;
f
||
d
.
data
(
"combodate"
,
f
=
new
b
(
this
,
g
)),
"string"
==
typeof
c
&&
"function"
==
typeof
f
[
c
]
&&
f
[
c
].
apply
(
f
,
e
)})},
a
.
fn
.
combodate
.
defaults
=
{
format
:
"DD-MM-YYYY HH:mm"
,
template
:
"D / MMM / YYYY H : mm"
,
value
:
null
,
minYear
:
1970
,
maxYear
:
2015
,
yearDescending
:
!
0
,
minuteStep
:
5
,
secondStep
:
1
,
firstItem
:
"empty"
,
errorClass
:
null
,
roundTime
:
!
0
,
smartDays
:
!
1
}}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
c
){
this
.
init
(
"combodate"
,
c
,
b
.
defaults
),
this
.
options
.
viewformat
||
(
this
.
options
.
viewformat
=
this
.
options
.
format
),
c
.
combodate
=
a
.
fn
.
editableutils
.
tryParseJson
(
c
.
combodate
,
!
0
),
this
.
options
.
combodate
=
a
.
extend
({},
b
.
defaults
.
combodate
,
c
.
combodate
,{
format
:
this
.
options
.
format
,
template
:
this
.
options
.
template
})};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
$input
.
combodate
(
this
.
options
.
combodate
),
"bs3"
===
a
.
fn
.
editableform
.
engine
&&
this
.
$input
.
siblings
().
find
(
"select"
).
addClass
(
"form-control"
),
this
.
options
.
inputclass
&&
this
.
$input
.
siblings
().
find
(
"select"
).
addClass
(
this
.
options
.
inputclass
)},
value2html
:
function
(
a
,
c
){
var
d
=
a
?
a
.
format
(
this
.
options
.
viewformat
):
""
;
b
.
superclass
.
value2html
.
call
(
this
,
d
,
c
)},
html2value
:
function
(
a
){
return
a
?
moment
(
a
,
this
.
options
.
viewformat
):
null
},
value2str
:
function
(
a
){
return
a
?
a
.
format
(
this
.
options
.
format
):
""
},
str2value
:
function
(
a
){
return
a
?
moment
(
a
,
this
.
options
.
format
):
null
},
value2submit
:
function
(
a
){
return
this
.
value2str
(
a
)},
value2input
:
function
(
a
){
this
.
$input
.
combodate
(
"setValue"
,
a
)},
input2value
:
function
(){
return
this
.
$input
.
combodate
(
"getValue"
,
null
)},
activate
:
function
(){
this
.
$input
.
siblings
(
".combodate"
).
find
(
"select"
).
eq
(
0
).
focus
()},
autosubmit
:
function
(){}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<input type="text">'
,
inputclass
:
null
,
format
:
"YYYY-MM-DD"
,
viewformat
:
null
,
template
:
"D / MMM / YYYY"
,
combodate
:
null
}),
a
.
fn
.
editabletypes
.
combodate
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
a
.
fn
.
editableform
.
Constructor
.
prototype
.
initInput
;
a
.
extend
(
a
.
fn
.
editableform
.
Constructor
.
prototype
,{
initTemplate
:
function
(){
this
.
$form
=
a
(
a
.
fn
.
editableform
.
template
),
this
.
$form
.
find
(
".editable-error-block"
).
addClass
(
"help-block"
)},
initInput
:
function
(){
b
.
apply
(
this
);
var
c
=
null
===
this
.
input
.
options
.
inputclass
||
this
.
input
.
options
.
inputclass
===!
1
,
d
=
"input-medium"
,
e
=
"text,select,textarea,password,email,url,tel,number,range,time"
.
split
(
","
);
~
a
.
inArray
(
this
.
input
.
type
,
e
)
&&
c
&&
(
this
.
input
.
options
.
inputclass
=
d
,
this
.
input
.
$input
.
addClass
(
d
))}}),
a
.
fn
.
editableform
.
buttons
=
'<button type="submit" class="btn btn-primary editable-submit"><i class="icon-ok icon-white"></i></button><button type="button" class="btn editable-cancel"><i class="icon-remove"></i></button>'
,
a
.
fn
.
editableform
.
errorGroupClass
=
"error"
,
a
.
fn
.
editableform
.
errorBlockClass
=
null
,
a
.
fn
.
editableform
.
engine
=
"bs2"
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
extend
(
a
.
fn
.
editableContainer
.
Popup
.
prototype
,{
containerName
:
"popover"
,
innerCss
:
a
.
fn
.
popover
&&
a
(
a
.
fn
.
popover
.
defaults
.
template
).
find
(
"p"
).
length
?
".popover-content p"
:
".popover-content"
,
defaults
:
a
.
fn
.
popover
.
defaults
,
initContainer
:
function
(){
a
.
extend
(
this
.
containerOptions
,{
trigger
:
"manual"
,
selector
:
!
1
,
content
:
" "
,
template
:
this
.
defaults
.
template
});
var
b
;
this
.
$element
.
data
(
"template"
)
&&
(
b
=
this
.
$element
.
data
(
"template"
),
this
.
$element
.
removeData
(
"template"
)),
this
.
call
(
this
.
containerOptions
),
b
&&
this
.
$element
.
data
(
"template"
,
b
)},
innerShow
:
function
(){
this
.
call
(
"show"
)},
innerHide
:
function
(){
this
.
call
(
"hide"
)},
innerDestroy
:
function
(){
this
.
call
(
"destroy"
)},
setContainerOption
:
function
(
a
,
b
){
this
.
container
().
options
[
a
]
=
b
},
setPosition
:
function
(){
!
function
(){
var
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
,
j
,
k
,
l
=
this
.
tip
();
switch
(
f
=
"function"
==
typeof
this
.
options
.
placement
?
this
.
options
.
placement
.
call
(
this
,
l
[
0
],
this
.
$element
[
0
]):
this
.
options
.
placement
,
b
=
/in/
.
test
(
f
),
l
.
removeClass
(
"top right bottom left"
).
css
({
top
:
0
,
left
:
0
,
display
:
"block"
}),
c
=
this
.
getPosition
(
b
),
d
=
l
[
0
].
offsetWidth
,
e
=
l
[
0
].
offsetHeight
,
f
=
b
?
f
.
split
(
" "
)[
1
]:
f
,
i
=
{
top
:
c
.
top
+
c
.
height
,
left
:
c
.
left
+
c
.
width
/
2
-
d
/
2
},
h
=
{
top
:
c
.
top
-
e
,
left
:
c
.
left
+
c
.
width
/
2
-
d
/
2
},
j
=
{
top
:
c
.
top
+
c
.
height
/
2
-
e
/
2
,
left
:
c
.
left
-
d
},
k
=
{
top
:
c
.
top
+
c
.
height
/
2
-
e
/
2
,
left
:
c
.
left
+
c
.
width
},
f
){
case
"bottom"
:
i
.
top
+
e
>
a
(
window
).
scrollTop
()
+
a
(
window
).
height
()
&&
(
f
=
h
.
top
>
a
(
window
).
scrollTop
()?
"top"
:
k
.
left
+
d
<
a
(
window
).
scrollLeft
()
+
a
(
window
).
width
()?
"right"
:
j
.
left
>
a
(
window
).
scrollLeft
()?
"left"
:
"right"
);
break
;
case
"top"
:
h
.
top
<
a
(
window
).
scrollTop
()
&&
(
f
=
i
.
top
+
e
<
a
(
window
).
scrollTop
()
+
a
(
window
).
height
()?
"bottom"
:
k
.
left
+
d
<
a
(
window
).
scrollLeft
()
+
a
(
window
).
width
()?
"right"
:
j
.
left
>
a
(
window
).
scrollLeft
()?
"left"
:
"right"
);
break
;
case
"left"
:
j
.
left
<
a
(
window
).
scrollLeft
()
&&
(
f
=
k
.
left
+
d
<
a
(
window
).
scrollLeft
()
+
a
(
window
).
width
()?
"right"
:
h
.
top
>
a
(
window
).
scrollTop
()?
"top"
:
h
.
top
>
a
(
window
).
scrollTop
()?
"bottom"
:
"right"
);
break
;
case
"right"
:
k
.
left
+
d
>
a
(
window
).
scrollLeft
()
+
a
(
window
).
width
()
&&
(
j
.
left
>
a
(
window
).
scrollLeft
()?
f
=
"left"
:
h
.
top
>
a
(
window
).
scrollTop
()?
f
=
"top"
:
h
.
top
>
a
(
window
).
scrollTop
()
&&
(
f
=
"bottom"
))}
switch
(
f
){
case
"bottom"
:
g
=
i
;
break
;
case
"top"
:
g
=
h
;
break
;
case
"left"
:
g
=
j
;
break
;
case
"right"
:
g
=
k
}
l
.
offset
(
g
).
addClass
(
f
).
addClass
(
"in"
)}.
call
(
this
.
container
())}})}(
window
.
jQuery
),
function
(
a
){
function
b
(){
return
new
Date
(
Date
.
UTC
.
apply
(
Date
,
arguments
))}
function
c
(
b
,
c
){
var
d
,
e
=
a
(
b
).
data
(),
f
=
{},
g
=
new
RegExp
(
"^"
+
c
.
toLowerCase
()
+
"([A-Z])"
),
c
=
new
RegExp
(
"^"
+
c
.
toLowerCase
());
for
(
var
h
in
e
)
c
.
test
(
h
)
&&
(
d
=
h
.
replace
(
g
,
function
(
a
,
b
){
return
b
.
toLowerCase
()}),
f
[
d
]
=
e
[
h
]);
return
f
}
function
d
(
b
){
var
c
=
{};
if
(
k
[
b
]
||
(
b
=
b
.
split
(
"-"
)[
0
],
k
[
b
])){
var
d
=
k
[
b
];
return
a
.
each
(
j
,
function
(
a
,
b
){
b
in
d
&&
(
c
[
b
]
=
d
[
b
])}),
c
}}
var
e
=
function
(
b
,
c
){
this
.
_process_options
(
c
),
this
.
element
=
a
(
b
),
this
.
isInline
=!
1
,
this
.
isInput
=
this
.
element
.
is
(
"input"
),
this
.
component
=
this
.
element
.
is
(
".date"
)?
this
.
element
.
find
(
".add-on, .btn"
):
!
1
,
this
.
hasInput
=
this
.
component
&&
this
.
element
.
find
(
"input"
).
length
,
this
.
component
&&
0
===
this
.
component
.
length
&&
(
this
.
component
=!
1
),
this
.
picker
=
a
(
l
.
template
),
this
.
_buildEvents
(),
this
.
_attachEvents
(),
this
.
isInline
?
this
.
picker
.
addClass
(
"datepicker-inline"
).
appendTo
(
this
.
element
):
this
.
picker
.
addClass
(
"datepicker-dropdown dropdown-menu"
),
this
.
o
.
rtl
&&
(
this
.
picker
.
addClass
(
"datepicker-rtl"
),
this
.
picker
.
find
(
".prev i, .next i"
).
toggleClass
(
"icon-arrow-left icon-arrow-right"
)),
this
.
viewMode
=
this
.
o
.
startView
,
this
.
o
.
calendarWeeks
&&
this
.
picker
.
find
(
"tfoot th.today"
).
attr
(
"colspan"
,
function
(
a
,
b
){
return
parseInt
(
b
)
+
1
}),
this
.
_allow_update
=!
1
,
this
.
setStartDate
(
this
.
o
.
startDate
),
this
.
setEndDate
(
this
.
o
.
endDate
),
this
.
setDaysOfWeekDisabled
(
this
.
o
.
daysOfWeekDisabled
),
this
.
fillDow
(),
this
.
fillMonths
(),
this
.
_allow_update
=!
0
,
this
.
update
(),
this
.
showMode
(),
this
.
isInline
&&
this
.
show
()};
e
.
prototype
=
{
constructor
:
e
,
_process_options
:
function
(
b
){
this
.
_o
=
a
.
extend
({},
this
.
_o
,
b
);
var
c
=
this
.
o
=
a
.
extend
({},
this
.
_o
),
d
=
c
.
language
;
switch
(
k
[
d
]
||
(
d
=
d
.
split
(
"-"
)[
0
],
k
[
d
]
||
(
d
=
i
.
language
)),
c
.
language
=
d
,
c
.
startView
){
case
2
:
case
"decade"
:
c
.
startView
=
2
;
break
;
case
1
:
case
"year"
:
c
.
startView
=
1
;
break
;
default
:
c
.
startView
=
0
}
switch
(
c
.
minViewMode
){
case
1
:
case
"months"
:
c
.
minViewMode
=
1
;
break
;
case
2
:
case
"years"
:
c
.
minViewMode
=
2
;
break
;
default
:
c
.
minViewMode
=
0
}
c
.
startView
=
Math
.
max
(
c
.
startView
,
c
.
minViewMode
),
c
.
weekStart
%=
7
,
c
.
weekEnd
=
(
c
.
weekStart
+
6
)
%
7
;
var
e
=
l
.
parseFormat
(
c
.
format
);
c
.
startDate
!==-
1
/
0
&&
(
c
.
startDate
=
l
.
parseDate
(
c
.
startDate
,
e
,
c
.
language
)),
1
/
0
!==
c
.
endDate
&&
(
c
.
endDate
=
l
.
parseDate
(
c
.
endDate
,
e
,
c
.
language
)),
c
.
daysOfWeekDisabled
=
c
.
daysOfWeekDisabled
||
[],
a
.
isArray
(
c
.
daysOfWeekDisabled
)
||
(
c
.
daysOfWeekDisabled
=
c
.
daysOfWeekDisabled
.
split
(
/
[
,
\s]
*/
)),
c
.
daysOfWeekDisabled
=
a
.
map
(
c
.
daysOfWeekDisabled
,
function
(
a
){
return
parseInt
(
a
,
10
)})},
_events
:[],
_secondaryEvents
:[],
_applyEvents
:
function
(
a
){
for
(
var
b
,
c
,
d
=
0
;
d
<
a
.
length
;
d
++
)
b
=
a
[
d
][
0
],
c
=
a
[
d
][
1
],
b
.
on
(
c
)},
_unapplyEvents
:
function
(
a
){
for
(
var
b
,
c
,
d
=
0
;
d
<
a
.
length
;
d
++
)
b
=
a
[
d
][
0
],
c
=
a
[
d
][
1
],
b
.
off
(
c
)},
_buildEvents
:
function
(){
this
.
isInput
?
this
.
_events
=
[[
this
.
element
,{
focus
:
a
.
proxy
(
this
.
show
,
this
),
keyup
:
a
.
proxy
(
this
.
update
,
this
),
keydown
:
a
.
proxy
(
this
.
keydown
,
this
)}]]:
this
.
component
&&
this
.
hasInput
?
this
.
_events
=
[[
this
.
element
.
find
(
"input"
),{
focus
:
a
.
proxy
(
this
.
show
,
this
),
keyup
:
a
.
proxy
(
this
.
update
,
this
),
keydown
:
a
.
proxy
(
this
.
keydown
,
this
)}],[
this
.
component
,{
click
:
a
.
proxy
(
this
.
show
,
this
)}]]:
this
.
element
.
is
(
"div"
)?
this
.
isInline
=!
0
:
this
.
_events
=
[[
this
.
element
,{
click
:
a
.
proxy
(
this
.
show
,
this
)}]],
this
.
_secondaryEvents
=
[[
this
.
picker
,{
click
:
a
.
proxy
(
this
.
click
,
this
)}],[
a
(
window
),{
resize
:
a
.
proxy
(
this
.
place
,
this
)}],[
a
(
document
),{
mousedown
:
a
.
proxy
(
function
(
a
){
this
.
element
.
is
(
a
.
target
)
||
this
.
element
.
find
(
a
.
target
).
size
()
||
this
.
picker
.
is
(
a
.
target
)
||
this
.
picker
.
find
(
a
.
target
).
size
()
||
this
.
hide
()},
this
)}]]},
_attachEvents
:
function
(){
this
.
_detachEvents
(),
this
.
_applyEvents
(
this
.
_events
)},
_detachEvents
:
function
(){
this
.
_unapplyEvents
(
this
.
_events
)},
_attachSecondaryEvents
:
function
(){
this
.
_detachSecondaryEvents
(),
this
.
_applyEvents
(
this
.
_secondaryEvents
)},
_detachSecondaryEvents
:
function
(){
this
.
_unapplyEvents
(
this
.
_secondaryEvents
)},
_trigger
:
function
(
b
,
c
){
var
d
=
c
||
this
.
date
,
e
=
new
Date
(
d
.
getTime
()
+
6
e4
*
d
.
getTimezoneOffset
());
this
.
element
.
trigger
({
type
:
b
,
date
:
e
,
format
:
a
.
proxy
(
function
(
a
){
var
b
=
a
||
this
.
o
.
format
;
return
l
.
formatDate
(
d
,
b
,
this
.
o
.
language
)},
this
)})},
show
:
function
(
a
){
this
.
isInline
||
this
.
picker
.
appendTo
(
"body"
),
this
.
picker
.
show
(),
this
.
height
=
this
.
component
?
this
.
component
.
outerHeight
():
this
.
element
.
outerHeight
(),
this
.
place
(),
this
.
_attachSecondaryEvents
(),
a
&&
a
.
preventDefault
(),
this
.
_trigger
(
"show"
)},
hide
:
function
(){
this
.
isInline
||
this
.
picker
.
is
(
":visible"
)
&&
(
this
.
picker
.
hide
().
detach
(),
this
.
_detachSecondaryEvents
(),
this
.
viewMode
=
this
.
o
.
startView
,
this
.
showMode
(),
this
.
o
.
forceParse
&&
(
this
.
isInput
&&
this
.
element
.
val
()
||
this
.
hasInput
&&
this
.
element
.
find
(
"input"
).
val
())
&&
this
.
setValue
(),
this
.
_trigger
(
"hide"
))},
remove
:
function
(){
this
.
hide
(),
this
.
_detachEvents
(),
this
.
_detachSecondaryEvents
(),
this
.
picker
.
remove
(),
delete
this
.
element
.
data
().
datepicker
,
this
.
isInput
||
delete
this
.
element
.
data
().
date
},
getDate
:
function
(){
var
a
=
this
.
getUTCDate
();
return
new
Date
(
a
.
getTime
()
+
6
e4
*
a
.
getTimezoneOffset
())},
getUTCDate
:
function
(){
return
this
.
date
},
setDate
:
function
(
a
){
this
.
setUTCDate
(
new
Date
(
a
.
getTime
()
-
6
e4
*
a
.
getTimezoneOffset
()))},
setUTCDate
:
function
(
a
){
this
.
date
=
a
,
this
.
setValue
()},
setValue
:
function
(){
var
a
=
this
.
getFormattedDate
();
this
.
isInput
?
this
.
element
.
val
(
a
):
this
.
component
&&
this
.
element
.
find
(
"input"
).
val
(
a
)},
getFormattedDate
:
function
(
a
){
return
void
0
===
a
&&
(
a
=
this
.
o
.
format
),
l
.
formatDate
(
this
.
date
,
a
,
this
.
o
.
language
)},
setStartDate
:
function
(
a
){
this
.
_process_options
({
startDate
:
a
}),
this
.
update
(),
this
.
updateNavArrows
()},
setEndDate
:
function
(
a
){
this
.
_process_options
({
endDate
:
a
}),
this
.
update
(),
this
.
updateNavArrows
()},
setDaysOfWeekDisabled
:
function
(
a
){
this
.
_process_options
({
daysOfWeekDisabled
:
a
}),
this
.
update
(),
this
.
updateNavArrows
()},
place
:
function
(){
if
(
!
this
.
isInline
){
var
b
=
parseInt
(
this
.
element
.
parents
().
filter
(
function
(){
return
"auto"
!=
a
(
this
).
css
(
"z-index"
)}).
first
().
css
(
"z-index"
))
+
10
,
c
=
this
.
component
?
this
.
component
.
parent
().
offset
():
this
.
element
.
offset
(),
d
=
this
.
component
?
this
.
component
.
outerHeight
(
!
0
):
this
.
element
.
outerHeight
(
!
0
);
this
.
picker
.
css
({
top
:
c
.
top
+
d
,
left
:
c
.
left
,
zIndex
:
b
})}},
_allow_update
:
!
0
,
update
:
function
(){
if
(
this
.
_allow_update
){
var
a
,
b
=!
1
;
arguments
&&
arguments
.
length
&&
(
"string"
==
typeof
arguments
[
0
]
||
arguments
[
0
]
instanceof
Date
)?(
a
=
arguments
[
0
],
b
=!
0
):(
a
=
this
.
isInput
?
this
.
element
.
val
():
this
.
element
.
data
(
"date"
)
||
this
.
element
.
find
(
"input"
).
val
(),
delete
this
.
element
.
data
().
date
),
this
.
date
=
l
.
parseDate
(
a
,
this
.
o
.
format
,
this
.
o
.
language
),
b
&&
this
.
setValue
(),
this
.
viewDate
=
this
.
date
<
this
.
o
.
startDate
?
new
Date
(
this
.
o
.
startDate
):
this
.
date
>
this
.
o
.
endDate
?
new
Date
(
this
.
o
.
endDate
):
new
Date
(
this
.
date
),
this
.
fill
()}},
fillDow
:
function
(){
var
a
=
this
.
o
.
weekStart
,
b
=
"<tr>"
;
if
(
this
.
o
.
calendarWeeks
){
var
c
=
'<th class="cw"> </th>'
;
b
+=
c
,
this
.
picker
.
find
(
".datepicker-days thead tr:first-child"
).
prepend
(
c
)}
for
(;
a
<
this
.
o
.
weekStart
+
7
;)
b
+=
'<th class="dow">'
+
k
[
this
.
o
.
language
].
daysMin
[
a
++%
7
]
+
"</th>"
;
b
+=
"</tr>"
,
this
.
picker
.
find
(
".datepicker-days thead"
).
append
(
b
)},
fillMonths
:
function
(){
for
(
var
a
=
""
,
b
=
0
;
12
>
b
;)
a
+=
'<span class="month">'
+
k
[
this
.
o
.
language
].
monthsShort
[
b
++
]
+
"</span>"
;
this
.
picker
.
find
(
".datepicker-months td"
).
html
(
a
)},
setRange
:
function
(
b
){
b
&&
b
.
length
?
this
.
range
=
a
.
map
(
b
,
function
(
a
){
return
a
.
valueOf
()}):
delete
this
.
range
,
this
.
fill
()},
getClassNames
:
function
(
b
){
var
c
=
[],
d
=
this
.
viewDate
.
getUTCFullYear
(),
e
=
this
.
viewDate
.
getUTCMonth
(),
f
=
this
.
date
.
valueOf
(),
g
=
new
Date
;
return
b
.
getUTCFullYear
()
<
d
||
b
.
getUTCFullYear
()
==
d
&&
b
.
getUTCMonth
()
<
e
?
c
.
push
(
"old"
):(
b
.
getUTCFullYear
()
>
d
||
b
.
getUTCFullYear
()
==
d
&&
b
.
getUTCMonth
()
>
e
)
&&
c
.
push
(
"new"
),
this
.
o
.
todayHighlight
&&
b
.
getUTCFullYear
()
==
g
.
getFullYear
()
&&
b
.
getUTCMonth
()
==
g
.
getMonth
()
&&
b
.
getUTCDate
()
==
g
.
getDate
()
&&
c
.
push
(
"today"
),
f
&&
b
.
valueOf
()
==
f
&&
c
.
push
(
"active"
),(
b
.
valueOf
()
<
this
.
o
.
startDate
||
b
.
valueOf
()
>
this
.
o
.
endDate
||-
1
!==
a
.
inArray
(
b
.
getUTCDay
(),
this
.
o
.
daysOfWeekDisabled
))
&&
c
.
push
(
"disabled"
),
this
.
range
&&
(
b
>
this
.
range
[
0
]
&&
b
<
this
.
range
[
this
.
range
.
length
-
1
]
&&
c
.
push
(
"range"
),
-
1
!=
a
.
inArray
(
b
.
valueOf
(),
this
.
range
)
&&
c
.
push
(
"selected"
)),
c
},
fill
:
function
(){
var
c
,
d
=
new
Date
(
this
.
viewDate
),
e
=
d
.
getUTCFullYear
(),
f
=
d
.
getUTCMonth
(),
g
=
this
.
o
.
startDate
!==-
1
/
0
?
this
.
o
.
startDate
.
getUTCFullYear
():
-
1
/
0
,
h
=
this
.
o
.
startDate
!==-
1
/
0
?
this
.
o
.
startDate
.
getUTCMonth
():
-
1
/
0
,
i
=
1
/
0
!==
this
.
o
.
endDate
?
this
.
o
.
endDate
.
getUTCFullYear
():
1
/
0
,
j
=
1
/
0
!==
this
.
o
.
endDate
?
this
.
o
.
endDate
.
getUTCMonth
():
1
/
0
;
this
.
date
&&
this
.
date
.
valueOf
(),
this
.
picker
.
find
(
".datepicker-days thead th.datepicker-switch"
).
text
(
k
[
this
.
o
.
language
].
months
[
f
]
+
" "
+
e
),
this
.
picker
.
find
(
"tfoot th.today"
).
text
(
k
[
this
.
o
.
language
].
today
).
toggle
(
this
.
o
.
todayBtn
!==!
1
),
this
.
picker
.
find
(
"tfoot th.clear"
).
text
(
k
[
this
.
o
.
language
].
clear
).
toggle
(
this
.
o
.
clearBtn
!==!
1
),
this
.
updateNavArrows
(),
this
.
fillMonths
();
var
m
=
b
(
e
,
f
-
1
,
28
,
0
,
0
,
0
,
0
),
n
=
l
.
getDaysInMonth
(
m
.
getUTCFullYear
(),
m
.
getUTCMonth
());
m
.
setUTCDate
(
n
),
m
.
setUTCDate
(
n
-
(
m
.
getUTCDay
()
-
this
.
o
.
weekStart
+
7
)
%
7
);
var
o
=
new
Date
(
m
);
o
.
setUTCDate
(
o
.
getUTCDate
()
+
42
),
o
=
o
.
valueOf
();
for
(
var
p
,
q
=
[];
m
.
valueOf
()
<
o
;){
if
(
m
.
getUTCDay
()
==
this
.
o
.
weekStart
&&
(
q
.
push
(
"<tr>"
),
this
.
o
.
calendarWeeks
)){
var
r
=
new
Date
(
+
m
+
864
e5
*
((
this
.
o
.
weekStart
-
m
.
getUTCDay
()
-
7
)
%
7
)),
s
=
new
Date
(
+
r
+
864
e5
*
((
11
-
r
.
getUTCDay
())
%
7
)),
t
=
new
Date
(
+
(
t
=
b
(
s
.
getUTCFullYear
(),
0
,
1
))
+
864
e5
*
((
11
-
t
.
getUTCDay
())
%
7
)),
u
=
(
s
-
t
)
/
864
e5
/
7
+
1
;
q
.
push
(
'<td class="cw">'
+
u
+
"</td>"
)}
p
=
this
.
getClassNames
(
m
),
p
.
push
(
"day"
);
var
v
=
this
.
o
.
beforeShowDay
(
m
);
void
0
===
v
?
v
=
{}:
"boolean"
==
typeof
v
?
v
=
{
enabled
:
v
}:
"string"
==
typeof
v
&&
(
v
=
{
classes
:
v
}),
v
.
enabled
===!
1
&&
p
.
push
(
"disabled"
),
v
.
classes
&&
(
p
=
p
.
concat
(
v
.
classes
.
split
(
/
\s
+/
))),
v
.
tooltip
&&
(
c
=
v
.
tooltip
),
p
=
a
.
unique
(
p
),
q
.
push
(
'<td class="'
+
p
.
join
(
" "
)
+
'"'
+
(
c
?
' title="'
+
c
+
'"'
:
""
)
+
">"
+
m
.
getUTCDate
()
+
"</td>"
),
m
.
getUTCDay
()
==
this
.
o
.
weekEnd
&&
q
.
push
(
"</tr>"
),
m
.
setUTCDate
(
m
.
getUTCDate
()
+
1
)}
this
.
picker
.
find
(
".datepicker-days tbody"
).
empty
().
append
(
q
.
join
(
""
));
var
w
=
this
.
date
&&
this
.
date
.
getUTCFullYear
(),
x
=
this
.
picker
.
find
(
".datepicker-months"
).
find
(
"th:eq(1)"
).
text
(
e
).
end
().
find
(
"span"
).
removeClass
(
"active"
);
w
&&
w
==
e
&&
x
.
eq
(
this
.
date
.
getUTCMonth
()).
addClass
(
"active"
),(
g
>
e
||
e
>
i
)
&&
x
.
addClass
(
"disabled"
),
e
==
g
&&
x
.
slice
(
0
,
h
).
addClass
(
"disabled"
),
e
==
i
&&
x
.
slice
(
j
+
1
).
addClass
(
"disabled"
),
q
=
""
,
e
=
10
*
parseInt
(
e
/
10
,
10
);
var
y
=
this
.
picker
.
find
(
".datepicker-years"
).
find
(
"th:eq(1)"
).
text
(
e
+
"-"
+
(
e
+
9
)).
end
().
find
(
"td"
);
e
-=
1
;
for
(
var
z
=-
1
;
11
>
z
;
z
++
)
q
+=
'<span class="year'
+
(
-
1
==
z
?
" old"
:
10
==
z
?
" new"
:
""
)
+
(
w
==
e
?
" active"
:
""
)
+
(
g
>
e
||
e
>
i
?
" disabled"
:
""
)
+
'">'
+
e
+
"</span>"
,
e
+=
1
;
y
.
html
(
q
)},
updateNavArrows
:
function
(){
if
(
this
.
_allow_update
){
var
a
=
new
Date
(
this
.
viewDate
),
b
=
a
.
getUTCFullYear
(),
c
=
a
.
getUTCMonth
();
switch
(
this
.
viewMode
){
case
0
:
this
.
o
.
startDate
!==-
1
/
0
&&
b
<=
this
.
o
.
startDate
.
getUTCFullYear
()
&&
c
<=
this
.
o
.
startDate
.
getUTCMonth
()?
this
.
picker
.
find
(
".prev"
).
css
({
visibility
:
"hidden"
}):
this
.
picker
.
find
(
".prev"
).
css
({
visibility
:
"visible"
}),
1
/
0
!==
this
.
o
.
endDate
&&
b
>=
this
.
o
.
endDate
.
getUTCFullYear
()
&&
c
>=
this
.
o
.
endDate
.
getUTCMonth
()?
this
.
picker
.
find
(
".next"
).
css
({
visibility
:
"hidden"
}):
this
.
picker
.
find
(
".next"
).
css
({
visibility
:
"visible"
});
break
;
case
1
:
case
2
:
this
.
o
.
startDate
!==-
1
/
0
&&
b
<=
this
.
o
.
startDate
.
getUTCFullYear
()?
this
.
picker
.
find
(
".prev"
).
css
({
visibility
:
"hidden"
}):
this
.
picker
.
find
(
".prev"
).
css
({
visibility
:
"visible"
}),
1
/
0
!==
this
.
o
.
endDate
&&
b
>=
this
.
o
.
endDate
.
getUTCFullYear
()?
this
.
picker
.
find
(
".next"
).
css
({
visibility
:
"hidden"
}):
this
.
picker
.
find
(
".next"
).
css
({
visibility
:
"visible"
})}}},
click
:
function
(
c
){
c
.
preventDefault
();
var
d
=
a
(
c
.
target
).
closest
(
"span, td, th"
);
if
(
1
==
d
.
length
)
switch
(
d
[
0
].
nodeName
.
toLowerCase
()){
case
"th"
:
switch
(
d
[
0
].
className
){
case
"datepicker-switch"
:
this
.
showMode
(
1
);
break
;
case
"prev"
:
case
"next"
:
var
e
=
l
.
modes
[
this
.
viewMode
].
navStep
*
(
"prev"
==
d
[
0
].
className
?
-
1
:
1
);
switch
(
this
.
viewMode
){
case
0
:
this
.
viewDate
=
this
.
moveMonth
(
this
.
viewDate
,
e
);
break
;
case
1
:
case
2
:
this
.
viewDate
=
this
.
moveYear
(
this
.
viewDate
,
e
)}
this
.
fill
();
break
;
case
"today"
:
var
f
=
new
Date
;
f
=
b
(
f
.
getFullYear
(),
f
.
getMonth
(),
f
.
getDate
(),
0
,
0
,
0
),
this
.
showMode
(
-
2
);
var
g
=
"linked"
==
this
.
o
.
todayBtn
?
null
:
"view"
;
this
.
_setDate
(
f
,
g
);
break
;
case
"clear"
:
var
h
;
this
.
isInput
?
h
=
this
.
element
:
this
.
component
&&
(
h
=
this
.
element
.
find
(
"input"
)),
h
&&
h
.
val
(
""
).
change
(),
this
.
_trigger
(
"changeDate"
),
this
.
update
(),
this
.
o
.
autoclose
&&
this
.
hide
()}
break
;
case
"span"
:
if
(
!
d
.
is
(
".disabled"
)){
if
(
this
.
viewDate
.
setUTCDate
(
1
),
d
.
is
(
".month"
)){
var
i
=
1
,
j
=
d
.
parent
().
find
(
"span"
).
index
(
d
),
k
=
this
.
viewDate
.
getUTCFullYear
();
this
.
viewDate
.
setUTCMonth
(
j
),
this
.
_trigger
(
"changeMonth"
,
this
.
viewDate
),
1
===
this
.
o
.
minViewMode
&&
this
.
_setDate
(
b
(
k
,
j
,
i
,
0
,
0
,
0
,
0
))}
else
{
var
k
=
parseInt
(
d
.
text
(),
10
)
||
0
,
i
=
1
,
j
=
0
;
this
.
viewDate
.
setUTCFullYear
(
k
),
this
.
_trigger
(
"changeYear"
,
this
.
viewDate
),
2
===
this
.
o
.
minViewMode
&&
this
.
_setDate
(
b
(
k
,
j
,
i
,
0
,
0
,
0
,
0
))}
this
.
showMode
(
-
1
),
this
.
fill
()}
break
;
case
"td"
:
if
(
d
.
is
(
".day"
)
&&!
d
.
is
(
".disabled"
)){
var
i
=
parseInt
(
d
.
text
(),
10
)
||
1
,
k
=
this
.
viewDate
.
getUTCFullYear
(),
j
=
this
.
viewDate
.
getUTCMonth
();
d
.
is
(
".old"
)?
0
===
j
?(
j
=
11
,
k
-=
1
):
j
-=
1
:
d
.
is
(
".new"
)
&&
(
11
==
j
?(
j
=
0
,
k
+=
1
):
j
+=
1
),
this
.
_setDate
(
b
(
k
,
j
,
i
,
0
,
0
,
0
,
0
))}}},
_setDate
:
function
(
a
,
b
){
b
&&
"date"
!=
b
||
(
this
.
date
=
new
Date
(
a
)),
b
&&
"view"
!=
b
||
(
this
.
viewDate
=
new
Date
(
a
)),
this
.
fill
(),
this
.
setValue
(),
this
.
_trigger
(
"changeDate"
);
var
c
;
this
.
isInput
?
c
=
this
.
element
:
this
.
component
&&
(
c
=
this
.
element
.
find
(
"input"
)),
c
&&
(
c
.
change
(),
!
this
.
o
.
autoclose
||
b
&&
"date"
!=
b
||
this
.
hide
())},
moveMonth
:
function
(
a
,
b
){
if
(
!
b
)
return
a
;
var
c
,
d
,
e
=
new
Date
(
a
.
valueOf
()),
f
=
e
.
getUTCDate
(),
g
=
e
.
getUTCMonth
(),
h
=
Math
.
abs
(
b
);
if
(
b
=
b
>
0
?
1
:
-
1
,
1
==
h
)
d
=-
1
==
b
?
function
(){
return
e
.
getUTCMonth
()
==
g
}:
function
(){
return
e
.
getUTCMonth
()
!=
c
},
c
=
g
+
b
,
e
.
setUTCMonth
(
c
),(
0
>
c
||
c
>
11
)
&&
(
c
=
(
c
+
12
)
%
12
);
else
{
for
(
var
i
=
0
;
h
>
i
;
i
++
)
e
=
this
.
moveMonth
(
e
,
b
);
c
=
e
.
getUTCMonth
(),
e
.
setUTCDate
(
f
),
d
=
function
(){
return
c
!=
e
.
getUTCMonth
()}}
for
(;
d
();)
e
.
setUTCDate
(
--
f
),
e
.
setUTCMonth
(
c
);
return
e
},
moveYear
:
function
(
a
,
b
){
return
this
.
moveMonth
(
a
,
12
*
b
)},
dateWithinRange
:
function
(
a
){
return
a
>=
this
.
o
.
startDate
&&
a
<=
this
.
o
.
endDate
},
keydown
:
function
(
a
){
if
(
this
.
picker
.
is
(
":not(:visible)"
))
return
27
==
a
.
keyCode
&&
this
.
show
(),
void
0
;
var
b
,
c
,
d
,
e
=!
1
;
switch
(
a
.
keyCode
){
case
27
:
this
.
hide
(),
a
.
preventDefault
();
break
;
case
37
:
case
39
:
if
(
!
this
.
o
.
keyboardNavigation
)
break
;
b
=
37
==
a
.
keyCode
?
-
1
:
1
,
a
.
ctrlKey
?(
c
=
this
.
moveYear
(
this
.
date
,
b
),
d
=
this
.
moveYear
(
this
.
viewDate
,
b
)):
a
.
shiftKey
?(
c
=
this
.
moveMonth
(
this
.
date
,
b
),
d
=
this
.
moveMonth
(
this
.
viewDate
,
b
)):(
c
=
new
Date
(
this
.
date
),
c
.
setUTCDate
(
this
.
date
.
getUTCDate
()
+
b
),
d
=
new
Date
(
this
.
viewDate
),
d
.
setUTCDate
(
this
.
viewDate
.
getUTCDate
()
+
b
)),
this
.
dateWithinRange
(
c
)
&&
(
this
.
date
=
c
,
this
.
viewDate
=
d
,
this
.
setValue
(),
this
.
update
(),
a
.
preventDefault
(),
e
=!
0
);
break
;
case
38
:
case
40
:
if
(
!
this
.
o
.
keyboardNavigation
)
break
;
b
=
38
==
a
.
keyCode
?
-
1
:
1
,
a
.
ctrlKey
?(
c
=
this
.
moveYear
(
this
.
date
,
b
),
d
=
this
.
moveYear
(
this
.
viewDate
,
b
)):
a
.
shiftKey
?(
c
=
this
.
moveMonth
(
this
.
date
,
b
),
d
=
this
.
moveMonth
(
this
.
viewDate
,
b
)):(
c
=
new
Date
(
this
.
date
),
c
.
setUTCDate
(
this
.
date
.
getUTCDate
()
+
7
*
b
),
d
=
new
Date
(
this
.
viewDate
),
d
.
setUTCDate
(
this
.
viewDate
.
getUTCDate
()
+
7
*
b
)),
this
.
dateWithinRange
(
c
)
&&
(
this
.
date
=
c
,
this
.
viewDate
=
d
,
this
.
setValue
(),
this
.
update
(),
a
.
preventDefault
(),
e
=!
0
);
break
;
case
13
:
this
.
hide
(),
a
.
preventDefault
();
break
;
case
9
:
this
.
hide
()}
if
(
e
){
this
.
_trigger
(
"changeDate"
);
var
f
;
this
.
isInput
?
f
=
this
.
element
:
this
.
component
&&
(
f
=
this
.
element
.
find
(
"input"
)),
f
&&
f
.
change
()}},
showMode
:
function
(
a
){
a
&&
(
this
.
viewMode
=
Math
.
max
(
this
.
o
.
minViewMode
,
Math
.
min
(
2
,
this
.
viewMode
+
a
))),
this
.
picker
.
find
(
">div"
).
hide
().
filter
(
".datepicker-"
+
l
.
modes
[
this
.
viewMode
].
clsName
).
css
(
"display"
,
"block"
),
this
.
updateNavArrows
()}};
var
f
=
function
(
b
,
c
){
this
.
element
=
a
(
b
),
this
.
inputs
=
a
.
map
(
c
.
inputs
,
function
(
a
){
return
a
.
jquery
?
a
[
0
]:
a
}),
delete
c
.
inputs
,
a
(
this
.
inputs
).
datepicker
(
c
).
bind
(
"changeDate"
,
a
.
proxy
(
this
.
dateUpdated
,
this
)),
this
.
pickers
=
a
.
map
(
this
.
inputs
,
function
(
b
){
return
a
(
b
).
data
(
"datepicker"
)}),
this
.
updateDates
()};
f
.
prototype
=
{
updateDates
:
function
(){
this
.
dates
=
a
.
map
(
this
.
pickers
,
function
(
a
){
return
a
.
date
}),
this
.
updateRanges
()},
updateRanges
:
function
(){
var
b
=
a
.
map
(
this
.
dates
,
function
(
a
){
return
a
.
valueOf
()});
a
.
each
(
this
.
pickers
,
function
(
a
,
c
){
c
.
setRange
(
b
)})},
dateUpdated
:
function
(
b
){
var
c
=
a
(
b
.
target
).
data
(
"datepicker"
),
d
=
c
.
getUTCDate
(),
e
=
a
.
inArray
(
b
.
target
,
this
.
inputs
),
f
=
this
.
inputs
.
length
;
if
(
-
1
!=
e
){
if
(
d
<
this
.
dates
[
e
])
for
(;
e
>=
0
&&
d
<
this
.
dates
[
e
];)
this
.
pickers
[
e
--
].
setUTCDate
(
d
);
else
if
(
d
>
this
.
dates
[
e
])
for
(;
f
>
e
&&
d
>
this
.
dates
[
e
];)
this
.
pickers
[
e
++
].
setUTCDate
(
d
);
this
.
updateDates
()}},
remove
:
function
(){
a
.
map
(
this
.
pickers
,
function
(
a
){
a
.
remove
()}),
delete
this
.
element
.
data
().
datepicker
}};
var
g
=
a
.
fn
.
datepicker
,
h
=
a
.
fn
.
datepicker
=
function
(
b
){
var
g
=
Array
.
apply
(
null
,
arguments
);
g
.
shift
();
var
h
;
return
this
.
each
(
function
(){
var
j
=
a
(
this
),
k
=
j
.
data
(
"datepicker"
),
l
=
"object"
==
typeof
b
&&
b
;
if
(
!
k
){
var
m
=
c
(
this
,
"date"
),
n
=
a
.
extend
({},
i
,
m
,
l
),
o
=
d
(
n
.
language
),
p
=
a
.
extend
({},
i
,
o
,
m
,
l
);
if
(
j
.
is
(
".input-daterange"
)
||
p
.
inputs
){
var
q
=
{
inputs
:
p
.
inputs
||
j
.
find
(
"input"
).
toArray
()};
j
.
data
(
"datepicker"
,
k
=
new
f
(
this
,
a
.
extend
(
p
,
q
)))}
else
j
.
data
(
"datepicker"
,
k
=
new
e
(
this
,
p
))}
return
"string"
==
typeof
b
&&
"function"
==
typeof
k
[
b
]
&&
(
h
=
k
[
b
].
apply
(
k
,
g
),
void
0
!==
h
)?
!
1
:
void
0
}),
void
0
!==
h
?
h
:
this
},
i
=
a
.
fn
.
datepicker
.
defaults
=
{
autoclose
:
!
1
,
beforeShowDay
:
a
.
noop
,
calendarWeeks
:
!
1
,
clearBtn
:
!
1
,
daysOfWeekDisabled
:[],
endDate
:
1
/
0
,
forceParse
:
!
0
,
format
:
"mm/dd/yyyy"
,
keyboardNavigation
:
!
0
,
language
:
"en"
,
minViewMode
:
0
,
rtl
:
!
1
,
startDate
:
-
1
/
0
,
startView
:
0
,
todayBtn
:
!
1
,
todayHighlight
:
!
1
,
weekStart
:
0
},
j
=
a
.
fn
.
datepicker
.
locale_opts
=
[
"format"
,
"rtl"
,
"weekStart"
];
a
.
fn
.
datepicker
.
Constructor
=
e
;
var
k
=
a
.
fn
.
datepicker
.
dates
=
{
en
:{
days
:[
"Sunday"
,
"Monday"
,
"Tuesday"
,
"Wednesday"
,
"Thursday"
,
"Friday"
,
"Saturday"
,
"Sunday"
],
daysShort
:[
"Sun"
,
"Mon"
,
"Tue"
,
"Wed"
,
"Thu"
,
"Fri"
,
"Sat"
,
"Sun"
],
daysMin
:[
"Su"
,
"Mo"
,
"Tu"
,
"We"
,
"Th"
,
"Fr"
,
"Sa"
,
"Su"
],
months
:[
"January"
,
"February"
,
"March"
,
"April"
,
"May"
,
"June"
,
"July"
,
"August"
,
"September"
,
"October"
,
"November"
,
"December"
],
monthsShort
:[
"Jan"
,
"Feb"
,
"Mar"
,
"Apr"
,
"May"
,
"Jun"
,
"Jul"
,
"Aug"
,
"Sep"
,
"Oct"
,
"Nov"
,
"Dec"
],
today
:
"Today"
,
clear
:
"Clear"
}},
l
=
{
modes
:[{
clsName
:
"days"
,
navFnc
:
"Month"
,
navStep
:
1
},{
clsName
:
"months"
,
navFnc
:
"FullYear"
,
navStep
:
1
},{
clsName
:
"years"
,
navFnc
:
"FullYear"
,
navStep
:
10
}],
isLeapYear
:
function
(
a
){
return
0
===
a
%
4
&&
0
!==
a
%
100
||
0
===
a
%
400
},
getDaysInMonth
:
function
(
a
,
b
){
return
[
31
,
l
.
isLeapYear
(
a
)?
29
:
28
,
31
,
30
,
31
,
30
,
31
,
31
,
30
,
31
,
30
,
31
][
b
]},
validParts
:
/dd
?
|DD
?
|mm
?
|MM
?
|yy
(?:
yy
)?
/g
,
nonpunctuation
:
/
[^
-
\/
:-@
\[\u
3400-
\u
9fff-`{-~
\t\n\r]
+/g
,
parseFormat
:
function
(
a
){
var
b
=
a
.
replace
(
this
.
validParts
,
"
\
0"
).
split
(
"
\
0"
),
c
=
a
.
match
(
this
.
validParts
);
if
(
!
b
||!
b
.
length
||!
c
||
0
===
c
.
length
)
throw
new
Error
(
"Invalid date format."
);
return
{
separators
:
b
,
parts
:
c
}},
parseDate
:
function
(
c
,
d
,
f
){
if
(
c
instanceof
Date
)
return
c
;
if
(
"string"
==
typeof
d
&&
(
d
=
l
.
parseFormat
(
d
)),
/^
[\-
+
]\d
+
[
dmwy
]([\s
,
]
+
[\-
+
]\d
+
[
dmwy
])
*$/
.
test
(
c
)){
var
g
,
h
,
i
=
/
([\-
+
]\d
+
)([
dmwy
])
/
,
j
=
c
.
match
(
/
([\-
+
]\d
+
)([
dmwy
])
/g
);
c
=
new
Date
;
for
(
var
m
=
0
;
m
<
j
.
length
;
m
++
)
switch
(
g
=
i
.
exec
(
j
[
m
]),
h
=
parseInt
(
g
[
1
]),
g
[
2
]){
case
"d"
:
c
.
setUTCDate
(
c
.
getUTCDate
()
+
h
);
break
;
case
"m"
:
c
=
e
.
prototype
.
moveMonth
.
call
(
e
.
prototype
,
c
,
h
);
break
;
case
"w"
:
c
.
setUTCDate
(
c
.
getUTCDate
()
+
7
*
h
);
break
;
case
"y"
:
c
=
e
.
prototype
.
moveYear
.
call
(
e
.
prototype
,
c
,
h
)}
return
b
(
c
.
getUTCFullYear
(),
c
.
getUTCMonth
(),
c
.
getUTCDate
(),
0
,
0
,
0
)}
var
n
,
o
,
g
,
j
=
c
&&
c
.
match
(
this
.
nonpunctuation
)
||
[],
c
=
new
Date
,
p
=
{},
q
=
[
"yyyy"
,
"yy"
,
"M"
,
"MM"
,
"m"
,
"mm"
,
"d"
,
"dd"
],
r
=
{
yyyy
:
function
(
a
,
b
){
return
a
.
setUTCFullYear
(
b
)},
yy
:
function
(
a
,
b
){
return
a
.
setUTCFullYear
(
2
e3
+
b
)},
m
:
function
(
a
,
b
){
for
(
b
-=
1
;
0
>
b
;)
b
+=
12
;
for
(
b
%=
12
,
a
.
setUTCMonth
(
b
);
a
.
getUTCMonth
()
!=
b
;)
a
.
setUTCDate
(
a
.
getUTCDate
()
-
1
);
return
a
},
d
:
function
(
a
,
b
){
return
a
.
setUTCDate
(
b
)}};
r
.
M
=
r
.
MM
=
r
.
mm
=
r
.
m
,
r
.
dd
=
r
.
d
,
c
=
b
(
c
.
getFullYear
(),
c
.
getMonth
(),
c
.
getDate
(),
0
,
0
,
0
);
var
s
=
d
.
parts
.
slice
();
if
(
j
.
length
!=
s
.
length
&&
(
s
=
a
(
s
).
filter
(
function
(
b
,
c
){
return
-
1
!==
a
.
inArray
(
c
,
q
)}).
toArray
()),
j
.
length
==
s
.
length
){
for
(
var
m
=
0
,
t
=
s
.
length
;
t
>
m
;
m
++
){
if
(
n
=
parseInt
(
j
[
m
],
10
),
g
=
s
[
m
],
isNaN
(
n
))
switch
(
g
){
case
"MM"
:
o
=
a
(
k
[
f
].
months
).
filter
(
function
(){
var
a
=
this
.
slice
(
0
,
j
[
m
].
length
),
b
=
j
[
m
].
slice
(
0
,
a
.
length
);
return
a
==
b
}),
n
=
a
.
inArray
(
o
[
0
],
k
[
f
].
months
)
+
1
;
break
;
case
"M"
:
o
=
a
(
k
[
f
].
monthsShort
).
filter
(
function
(){
var
a
=
this
.
slice
(
0
,
j
[
m
].
length
),
b
=
j
[
m
].
slice
(
0
,
a
.
length
);
return
a
==
b
}),
n
=
a
.
inArray
(
o
[
0
],
k
[
f
].
monthsShort
)
+
1
}
p
[
g
]
=
n
}
for
(
var
u
,
m
=
0
;
m
<
q
.
length
;
m
++
)
u
=
q
[
m
],
u
in
p
&&!
isNaN
(
p
[
u
])
&&
r
[
u
](
c
,
p
[
u
])}
return
c
},
formatDate
:
function
(
b
,
c
,
d
){
"string"
==
typeof
c
&&
(
c
=
l
.
parseFormat
(
c
));
var
e
=
{
d
:
b
.
getUTCDate
(),
D
:
k
[
d
].
daysShort
[
b
.
getUTCDay
()],
DD
:
k
[
d
].
days
[
b
.
getUTCDay
()],
m
:
b
.
getUTCMonth
()
+
1
,
M
:
k
[
d
].
monthsShort
[
b
.
getUTCMonth
()],
MM
:
k
[
d
].
months
[
b
.
getUTCMonth
()],
yy
:
b
.
getUTCFullYear
().
toString
().
substring
(
2
),
yyyy
:
b
.
getUTCFullYear
()};
e
.
dd
=
(
e
.
d
<
10
?
"0"
:
""
)
+
e
.
d
,
e
.
mm
=
(
e
.
m
<
10
?
"0"
:
""
)
+
e
.
m
;
for
(
var
b
=
[],
f
=
a
.
extend
([],
c
.
separators
),
g
=
0
,
h
=
c
.
parts
.
length
;
h
>=
g
;
g
++
)
f
.
length
&&
b
.
push
(
f
.
shift
()),
b
.
push
(
e
[
c
.
parts
[
g
]]);
return
b
.
join
(
""
)},
headTemplate
:
'<thead><tr><th class="prev"><i class="icon-arrow-left"/></th><th colspan="5" class="datepicker-switch"></th><th class="next"><i class="icon-arrow-right"/></th></tr></thead>'
,
contTemplate
:
'<tbody><tr><td colspan="7"></td></tr></tbody>'
,
footTemplate
:
'<tfoot><tr><th colspan="7" class="today"></th></tr><tr><th colspan="7" class="clear"></th></tr></tfoot>'
};
l
.
template
=
'<div class="datepicker"><div class="datepicker-days"><table class=" table-condensed">'
+
l
.
headTemplate
+
"<tbody></tbody>"
+
l
.
footTemplate
+
"</table>"
+
"</div>"
+
'<div class="datepicker-months">'
+
'<table class="table-condensed">'
+
l
.
headTemplate
+
l
.
contTemplate
+
l
.
footTemplate
+
"</table>"
+
"</div>"
+
'<div class="datepicker-years">'
+
'<table class="table-condensed">'
+
l
.
headTemplate
+
l
.
contTemplate
+
l
.
footTemplate
+
"</table>"
+
"</div>"
+
"</div>"
,
a
.
fn
.
datepicker
.
DPGlobal
=
l
,
a
.
fn
.
datepicker
.
noConflict
=
function
(){
return
a
.
fn
.
datepicker
=
g
,
this
},
a
(
document
).
on
(
"focus.datepicker.data-api click.datepicker.data-api"
,
'[data-provide="datepicker"]'
,
function
(
b
){
var
c
=
a
(
this
);
c
.
data
(
"datepicker"
)
||
(
b
.
preventDefault
(),
h
.
call
(
c
,
"show"
))}),
a
(
function
(){
h
.
call
(
a
(
'[data-provide="datepicker-inline"]'
))})}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
fn
.
bdatepicker
=
a
.
fn
.
datepicker
.
noConflict
(),
a
.
fn
.
datepicker
||
(
a
.
fn
.
datepicker
=
a
.
fn
.
bdatepicker
);
var
b
=
function
(
a
){
this
.
init
(
"date"
,
a
,
b
.
defaults
),
this
.
initPicker
(
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
initPicker
:
function
(
b
,
c
){
this
.
options
.
viewformat
||
(
this
.
options
.
viewformat
=
this
.
options
.
format
),
b
.
datepicker
=
a
.
fn
.
editableutils
.
tryParseJson
(
b
.
datepicker
,
!
0
),
this
.
options
.
datepicker
=
a
.
extend
({},
c
.
datepicker
,
b
.
datepicker
,{
format
:
this
.
options
.
viewformat
}),
this
.
options
.
datepicker
.
language
=
this
.
options
.
datepicker
.
language
||
"en"
,
this
.
dpg
=
a
.
fn
.
bdatepicker
.
DPGlobal
,
this
.
parsedFormat
=
this
.
dpg
.
parseFormat
(
this
.
options
.
format
),
this
.
parsedViewFormat
=
this
.
dpg
.
parseFormat
(
this
.
options
.
viewformat
)},
render
:
function
(){
this
.
$input
.
bdatepicker
(
this
.
options
.
datepicker
),
this
.
options
.
clear
&&
(
this
.
$clear
=
a
(
'<a href="#"></a>'
).
html
(
this
.
options
.
clear
).
click
(
a
.
proxy
(
function
(
a
){
a
.
preventDefault
(),
a
.
stopPropagation
(),
this
.
clear
()},
this
)),
this
.
$tpl
.
parent
().
append
(
a
(
'<div class="editable-clear">'
).
append
(
this
.
$clear
)))},
value2html
:
function
(
a
,
c
){
var
d
=
a
?
this
.
dpg
.
formatDate
(
a
,
this
.
parsedViewFormat
,
this
.
options
.
datepicker
.
language
):
""
;
b
.
superclass
.
value2html
.
call
(
this
,
d
,
c
)},
html2value
:
function
(
a
){
return
this
.
parseDate
(
a
,
this
.
parsedViewFormat
)},
value2str
:
function
(
a
){
return
a
?
this
.
dpg
.
formatDate
(
a
,
this
.
parsedFormat
,
this
.
options
.
datepicker
.
language
):
""
},
str2value
:
function
(
a
){
return
this
.
parseDate
(
a
,
this
.
parsedFormat
)},
value2submit
:
function
(
a
){
return
this
.
value2str
(
a
)},
value2input
:
function
(
a
){
this
.
$input
.
bdatepicker
(
"update"
,
a
)},
input2value
:
function
(){
return
this
.
$input
.
data
(
"datepicker"
).
date
},
activate
:
function
(){},
clear
:
function
(){
this
.
$input
.
data
(
"datepicker"
).
date
=
null
,
this
.
$input
.
find
(
".active"
).
removeClass
(
"active"
),
this
.
options
.
showbuttons
||
this
.
$input
.
closest
(
"form"
).
submit
()},
autosubmit
:
function
(){
this
.
$input
.
on
(
"mouseup"
,
".day"
,
function
(
b
){
if
(
!
a
(
b
.
currentTarget
).
is
(
".old"
)
&&!
a
(
b
.
currentTarget
).
is
(
".new"
)){
var
c
=
a
(
this
).
closest
(
"form"
);
setTimeout
(
function
(){
c
.
submit
()},
200
)}})},
parseDate
:
function
(
a
,
b
){
var
c
,
d
=
null
;
return
a
&&
(
d
=
this
.
dpg
.
parseDate
(
a
,
b
,
this
.
options
.
datepicker
.
language
),
"string"
==
typeof
a
&&
(
c
=
this
.
dpg
.
formatDate
(
d
,
b
,
this
.
options
.
datepicker
.
language
),
a
!==
c
&&
(
d
=
null
))),
d
}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<div class="editable-date well"></div>'
,
inputclass
:
null
,
format
:
"yyyy-mm-dd"
,
viewformat
:
null
,
datepicker
:{
weekStart
:
0
,
startView
:
0
,
minViewMode
:
0
,
autoclose
:
!
1
},
clear
:
"× clear"
}),
a
.
fn
.
editabletypes
.
date
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"datefield"
,
a
,
b
.
defaults
),
this
.
initPicker
(
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
date
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
$input
=
this
.
$tpl
.
find
(
"input"
),
this
.
setClass
(),
this
.
setAttr
(
"placeholder"
),
this
.
$tpl
.
bdatepicker
(
this
.
options
.
datepicker
),
this
.
$input
.
off
(
"focus keydown"
),
this
.
$input
.
keyup
(
a
.
proxy
(
function
(){
this
.
$tpl
.
removeData
(
"date"
),
this
.
$tpl
.
bdatepicker
(
"update"
)},
this
))},
value2input
:
function
(
a
){
this
.
$input
.
val
(
a
?
this
.
dpg
.
formatDate
(
a
,
this
.
parsedViewFormat
,
this
.
options
.
datepicker
.
language
):
""
),
this
.
$tpl
.
bdatepicker
(
"update"
)},
input2value
:
function
(){
return
this
.
html2value
(
this
.
$input
.
val
())},
activate
:
function
(){
a
.
fn
.
editabletypes
.
text
.
prototype
.
activate
.
call
(
this
)},
autosubmit
:
function
(){}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
date
.
defaults
,{
tpl
:
'<div class="input-append date"><input type="text"/><span class="add-on"><i class="icon-th"></i></span></div>'
,
inputclass
:
"input-small"
,
datepicker
:{
weekStart
:
0
,
startView
:
0
,
minViewMode
:
0
,
autoclose
:
!
0
}}),
a
.
fn
.
editabletypes
.
datefield
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"datetime"
,
a
,
b
.
defaults
),
this
.
initPicker
(
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
initPicker
:
function
(
b
,
c
){
this
.
options
.
viewformat
||
(
this
.
options
.
viewformat
=
this
.
options
.
format
),
b
.
datetimepicker
=
a
.
fn
.
editableutils
.
tryParseJson
(
b
.
datetimepicker
,
!
0
),
this
.
options
.
datetimepicker
=
a
.
extend
({},
c
.
datetimepicker
,
b
.
datetimepicker
,{
format
:
this
.
options
.
viewformat
}),
this
.
options
.
datetimepicker
.
language
=
this
.
options
.
datetimepicker
.
language
||
"en"
,
this
.
dpg
=
a
.
fn
.
datetimepicker
.
DPGlobal
,
this
.
parsedFormat
=
this
.
dpg
.
parseFormat
(
this
.
options
.
format
,
this
.
options
.
formatType
),
this
.
parsedViewFormat
=
this
.
dpg
.
parseFormat
(
this
.
options
.
viewformat
,
this
.
options
.
formatType
)},
render
:
function
(){
this
.
$input
.
datetimepicker
(
this
.
options
.
datetimepicker
),
this
.
$input
.
on
(
"changeMode"
,
function
(){
var
b
=
a
(
this
).
closest
(
"form"
).
parent
();
setTimeout
(
function
(){
b
.
triggerHandler
(
"resize"
)},
0
)}),
this
.
options
.
clear
&&
(
this
.
$clear
=
a
(
'<a href="#"></a>'
).
html
(
this
.
options
.
clear
).
click
(
a
.
proxy
(
function
(
a
){
a
.
preventDefault
(),
a
.
stopPropagation
(),
this
.
clear
()},
this
)),
this
.
$tpl
.
parent
().
append
(
a
(
'<div class="editable-clear">'
).
append
(
this
.
$clear
)))},
value2html
:
function
(
a
,
c
){
var
d
=
a
?
this
.
dpg
.
formatDate
(
this
.
toUTC
(
a
),
this
.
parsedViewFormat
,
this
.
options
.
datetimepicker
.
language
,
this
.
options
.
formatType
):
""
;
return
c
?(
b
.
superclass
.
value2html
.
call
(
this
,
d
,
c
),
void
0
):
d
},
html2value
:
function
(
a
){
var
b
=
this
.
parseDate
(
a
,
this
.
parsedViewFormat
);
return
b
?
this
.
fromUTC
(
b
):
null
},
value2str
:
function
(
a
){
return
a
?
this
.
dpg
.
formatDate
(
this
.
toUTC
(
a
),
this
.
parsedFormat
,
this
.
options
.
datetimepicker
.
language
,
this
.
options
.
formatType
):
""
},
str2value
:
function
(
a
){
var
b
=
this
.
parseDate
(
a
,
this
.
parsedFormat
);
return
b
?
this
.
fromUTC
(
b
):
null
},
value2submit
:
function
(
a
){
return
this
.
value2str
(
a
)},
value2input
:
function
(
a
){
a
&&
this
.
$input
.
data
(
"datetimepicker"
).
setDate
(
a
)},
input2value
:
function
(){
var
a
=
this
.
$input
.
data
(
"datetimepicker"
);
return
a
.
date
?
a
.
getDate
():
null
},
activate
:
function
(){},
clear
:
function
(){
this
.
$input
.
data
(
"datetimepicker"
).
date
=
null
,
this
.
$input
.
find
(
".active"
).
removeClass
(
"active"
),
this
.
options
.
showbuttons
||
this
.
$input
.
closest
(
"form"
).
submit
()},
autosubmit
:
function
(){
this
.
$input
.
on
(
"mouseup"
,
".minute"
,
function
(){
var
b
=
a
(
this
).
closest
(
"form"
);
setTimeout
(
function
(){
b
.
submit
()},
200
)})},
toUTC
:
function
(
a
){
return
a
?
new
Date
(
a
.
valueOf
()
-
6
e4
*
a
.
getTimezoneOffset
()):
a
},
fromUTC
:
function
(
a
){
return
a
?
new
Date
(
a
.
valueOf
()
+
6
e4
*
a
.
getTimezoneOffset
()):
a
},
parseDate
:
function
(
a
,
b
){
var
c
,
d
=
null
;
return
a
&&
(
d
=
this
.
dpg
.
parseDate
(
a
,
b
,
this
.
options
.
datetimepicker
.
language
,
this
.
options
.
formatType
),
"string"
==
typeof
a
&&
(
c
=
this
.
dpg
.
formatDate
(
d
,
b
,
this
.
options
.
datetimepicker
.
language
,
this
.
options
.
formatType
),
a
!==
c
&&
(
d
=
null
))),
d
}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<div class="editable-date well"></div>'
,
inputclass
:
null
,
format
:
"yyyy-mm-dd hh:ii"
,
formatType
:
"standard"
,
viewformat
:
null
,
datetimepicker
:{
todayHighlight
:
!
1
,
autoclose
:
!
1
},
clear
:
"× clear"
}),
a
.
fn
.
editabletypes
.
datetime
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"datetimefield"
,
a
,
b
.
defaults
),
this
.
initPicker
(
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
datetime
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
$input
=
this
.
$tpl
.
find
(
"input"
),
this
.
setClass
(),
this
.
setAttr
(
"placeholder"
),
this
.
$tpl
.
datetimepicker
(
this
.
options
.
datetimepicker
),
this
.
$input
.
off
(
"focus keydown"
),
this
.
$input
.
keyup
(
a
.
proxy
(
function
(){
this
.
$tpl
.
removeData
(
"date"
),
this
.
$tpl
.
datetimepicker
(
"update"
)},
this
))},
value2input
:
function
(
a
){
this
.
$input
.
val
(
this
.
value2html
(
a
)),
this
.
$tpl
.
datetimepicker
(
"update"
)},
input2value
:
function
(){
return
this
.
html2value
(
this
.
$input
.
val
())},
activate
:
function
(){
a
.
fn
.
editabletypes
.
text
.
prototype
.
activate
.
call
(
this
)},
autosubmit
:
function
(){}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
datetime
.
defaults
,{
tpl
:
'<div class="input-append date"><input type="text"/><span class="add-on"><i class="icon-th"></i></span></div>'
,
inputclass
:
"input-medium"
,
datetimepicker
:{
todayHighlight
:
!
1
,
autoclose
:
!
0
}}),
a
.
fn
.
editabletypes
.
datetimefield
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
c
){
this
.
init
(
"typeahead"
,
c
,
b
.
defaults
),
this
.
options
.
typeahead
=
a
.
extend
({},
b
.
defaults
.
typeahead
,{
matcher
:
this
.
matcher
,
sorter
:
this
.
sorter
,
highlighter
:
this
.
highlighter
,
updater
:
this
.
updater
},
c
.
typeahead
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
list
),
a
.
extend
(
b
.
prototype
,{
renderList
:
function
(){
this
.
$input
=
this
.
$tpl
.
is
(
"input"
)?
this
.
$tpl
:
this
.
$tpl
.
find
(
'input[type="text"]'
),
this
.
options
.
typeahead
.
source
=
this
.
sourceData
,
this
.
$input
.
typeahead
(
this
.
options
.
typeahead
);
var
b
=
this
.
$input
.
data
(
"typeahead"
);
b
.
render
=
a
.
proxy
(
this
.
typeaheadRender
,
b
),
b
.
select
=
a
.
proxy
(
this
.
typeaheadSelect
,
b
),
b
.
move
=
a
.
proxy
(
this
.
typeaheadMove
,
b
),
this
.
renderClear
(),
this
.
setClass
(),
this
.
setAttr
(
"placeholder"
)},
value2htmlFinal
:
function
(
b
,
c
){
if
(
this
.
getIsObjects
()){
var
d
=
a
.
fn
.
editableutils
.
itemsByValue
(
b
,
this
.
sourceData
);
b
=
d
.
length
?
d
[
0
].
text
:
""
}
a
.
fn
.
editabletypes
.
abstractinput
.
prototype
.
value2html
.
call
(
this
,
b
,
c
)},
html2value
:
function
(
a
){
return
a
?
a
:
null
},
value2input
:
function
(
b
){
if
(
this
.
getIsObjects
()){
var
c
=
a
.
fn
.
editableutils
.
itemsByValue
(
b
,
this
.
sourceData
);
this
.
$input
.
data
(
"value"
,
b
).
val
(
c
.
length
?
c
[
0
].
text
:
""
)}
else
this
.
$input
.
val
(
b
)},
input2value
:
function
(){
if
(
this
.
getIsObjects
()){
var
b
=
this
.
$input
.
data
(
"value"
),
c
=
a
.
fn
.
editableutils
.
itemsByValue
(
b
,
this
.
sourceData
);
return
c
.
length
&&
c
[
0
].
text
.
toLowerCase
()
===
this
.
$input
.
val
().
toLowerCase
()?
b
:
null
}
return
this
.
$input
.
val
()},
getIsObjects
:
function
(){
if
(
void
0
===
this
.
isObjects
){
this
.
isObjects
=!
1
;
for
(
var
a
=
0
;
a
<
this
.
sourceData
.
length
;
a
++
)
if
(
this
.
sourceData
[
a
].
value
!==
this
.
sourceData
[
a
].
text
){
this
.
isObjects
=!
0
;
break
}}
return
this
.
isObjects
},
activate
:
a
.
fn
.
editabletypes
.
text
.
prototype
.
activate
,
renderClear
:
a
.
fn
.
editabletypes
.
text
.
prototype
.
renderClear
,
postrender
:
a
.
fn
.
editabletypes
.
text
.
prototype
.
postrender
,
toggleClear
:
a
.
fn
.
editabletypes
.
text
.
prototype
.
toggleClear
,
clear
:
function
(){
a
.
fn
.
editabletypes
.
text
.
prototype
.
clear
.
call
(
this
),
this
.
$input
.
data
(
"value"
,
""
)},
matcher
:
function
(
b
){
return
a
.
fn
.
typeahead
.
Constructor
.
prototype
.
matcher
.
call
(
this
,
b
.
text
)},
sorter
:
function
(
a
){
for
(
var
b
,
c
,
d
=
[],
e
=
[],
f
=
[];
b
=
a
.
shift
();)
c
=
b
.
text
,
c
.
toLowerCase
().
indexOf
(
this
.
query
.
toLowerCase
())?
~
c
.
indexOf
(
this
.
query
)?
e
.
push
(
b
):
f
.
push
(
b
):
d
.
push
(
b
);
return
d
.
concat
(
e
,
f
)},
highlighter
:
function
(
b
){
return
a
.
fn
.
typeahead
.
Constructor
.
prototype
.
highlighter
.
call
(
this
,
b
.
text
)},
updater
:
function
(
a
){
return
this
.
$element
.
data
(
"value"
,
a
.
value
),
a
.
text
},
typeaheadRender
:
function
(
b
){
var
c
=
this
;
return
b
=
a
(
b
).
map
(
function
(
b
,
d
){
return
b
=
a
(
c
.
options
.
item
).
data
(
"item"
,
d
),
b
.
find
(
"a"
).
html
(
c
.
highlighter
(
d
)),
b
[
0
]}),
this
.
options
.
autoSelect
&&
b
.
first
().
addClass
(
"active"
),
this
.
$menu
.
html
(
b
),
this
},
typeaheadSelect
:
function
(){
var
a
=
this
.
$menu
.
find
(
".active"
).
data
(
"item"
);
return
(
this
.
options
.
autoSelect
||
a
)
&&
this
.
$element
.
val
(
this
.
updater
(
a
)).
change
(),
this
.
hide
()},
typeaheadMove
:
function
(
a
){
if
(
this
.
shown
){
switch
(
a
.
keyCode
){
case
9
:
case
13
:
case
27
:
if
(
!
this
.
$menu
.
find
(
".active"
).
length
)
return
;
a
.
preventDefault
();
break
;
case
38
:
a
.
preventDefault
(),
this
.
prev
();
break
;
case
40
:
a
.
preventDefault
(),
this
.
next
()}
a
.
stopPropagation
()}}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
list
.
defaults
,{
tpl
:
'<input type="text">'
,
typeahead
:
null
,
clear
:
!
0
}),
a
.
fn
.
editabletypes
.
typeahead
=
b
}(
window
.
jQuery
);
\ No newline at end of file
flask_admin/static/vendor/x-editable/js/bootstrap3-editable-1.5.1.min.js
0 → 100644
View file @
2b4bfe35
/*! X-editable - v1.5.1
* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
* http://github.com/vitalets/x-editable
* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */
!
function
(
a
){
"use strict"
;
var
b
=
function
(
b
,
c
){
this
.
options
=
a
.
extend
({},
a
.
fn
.
editableform
.
defaults
,
c
),
this
.
$div
=
a
(
b
),
this
.
options
.
scope
||
(
this
.
options
.
scope
=
this
)};
b
.
prototype
=
{
constructor
:
b
,
initInput
:
function
(){
this
.
input
=
this
.
options
.
input
,
this
.
value
=
this
.
input
.
str2value
(
this
.
options
.
value
),
this
.
input
.
prerender
()},
initTemplate
:
function
(){
this
.
$form
=
a
(
a
.
fn
.
editableform
.
template
)},
initButtons
:
function
(){
var
b
=
this
.
$form
.
find
(
".editable-buttons"
);
b
.
append
(
a
.
fn
.
editableform
.
buttons
),
"bottom"
===
this
.
options
.
showbuttons
&&
b
.
addClass
(
"editable-buttons-bottom"
)},
render
:
function
(){
this
.
$loading
=
a
(
a
.
fn
.
editableform
.
loading
),
this
.
$div
.
empty
().
append
(
this
.
$loading
),
this
.
initTemplate
(),
this
.
options
.
showbuttons
?
this
.
initButtons
():
this
.
$form
.
find
(
".editable-buttons"
).
remove
(),
this
.
showLoading
(),
this
.
isSaving
=!
1
,
this
.
$div
.
triggerHandler
(
"rendering"
),
this
.
initInput
(),
this
.
$form
.
find
(
"div.editable-input"
).
append
(
this
.
input
.
$tpl
),
this
.
$div
.
append
(
this
.
$form
),
a
.
when
(
this
.
input
.
render
()).
then
(
a
.
proxy
(
function
(){
if
(
this
.
options
.
showbuttons
||
this
.
input
.
autosubmit
(),
this
.
$form
.
find
(
".editable-cancel"
).
click
(
a
.
proxy
(
this
.
cancel
,
this
)),
this
.
input
.
error
)
this
.
error
(
this
.
input
.
error
),
this
.
$form
.
find
(
".editable-submit"
).
attr
(
"disabled"
,
!
0
),
this
.
input
.
$input
.
attr
(
"disabled"
,
!
0
),
this
.
$form
.
submit
(
function
(
a
){
a
.
preventDefault
()});
else
{
this
.
error
(
!
1
),
this
.
input
.
$input
.
removeAttr
(
"disabled"
),
this
.
$form
.
find
(
".editable-submit"
).
removeAttr
(
"disabled"
);
var
b
=
null
===
this
.
value
||
void
0
===
this
.
value
||
""
===
this
.
value
?
this
.
options
.
defaultValue
:
this
.
value
;
this
.
input
.
value2input
(
b
),
this
.
$form
.
submit
(
a
.
proxy
(
this
.
submit
,
this
))}
this
.
$div
.
triggerHandler
(
"rendered"
),
this
.
showForm
(),
this
.
input
.
postrender
&&
this
.
input
.
postrender
()},
this
))},
cancel
:
function
(){
this
.
$div
.
triggerHandler
(
"cancel"
)},
showLoading
:
function
(){
var
a
,
b
;
this
.
$form
?(
a
=
this
.
$form
.
outerWidth
(),
b
=
this
.
$form
.
outerHeight
(),
a
&&
this
.
$loading
.
width
(
a
),
b
&&
this
.
$loading
.
height
(
b
),
this
.
$form
.
hide
()):(
a
=
this
.
$loading
.
parent
().
width
(),
a
&&
this
.
$loading
.
width
(
a
)),
this
.
$loading
.
show
()},
showForm
:
function
(
a
){
this
.
$loading
.
hide
(),
this
.
$form
.
show
(),
a
!==!
1
&&
this
.
input
.
activate
(),
this
.
$div
.
triggerHandler
(
"show"
)},
error
:
function
(
b
){
var
c
,
d
=
this
.
$form
.
find
(
".control-group"
),
e
=
this
.
$form
.
find
(
".editable-error-block"
);
if
(
b
===!
1
)
d
.
removeClass
(
a
.
fn
.
editableform
.
errorGroupClass
),
e
.
removeClass
(
a
.
fn
.
editableform
.
errorBlockClass
).
empty
().
hide
();
else
{
if
(
b
){
c
=
(
""
+
b
).
split
(
"
\n
"
);
for
(
var
f
=
0
;
f
<
c
.
length
;
f
++
)
c
[
f
]
=
a
(
"<div>"
).
text
(
c
[
f
]).
html
();
b
=
c
.
join
(
"<br>"
)}
d
.
addClass
(
a
.
fn
.
editableform
.
errorGroupClass
),
e
.
addClass
(
a
.
fn
.
editableform
.
errorBlockClass
).
html
(
b
).
show
()}},
submit
:
function
(
b
){
b
.
stopPropagation
(),
b
.
preventDefault
();
var
c
=
this
.
input
.
input2value
(),
d
=
this
.
validate
(
c
);
if
(
"object"
===
a
.
type
(
d
)
&&
void
0
!==
d
.
newValue
){
if
(
c
=
d
.
newValue
,
this
.
input
.
value2input
(
c
),
"string"
==
typeof
d
.
msg
)
return
this
.
error
(
d
.
msg
),
this
.
showForm
(),
void
0
}
else
if
(
d
)
return
this
.
error
(
d
),
this
.
showForm
(),
void
0
;
if
(
!
this
.
options
.
savenochange
&&
this
.
input
.
value2str
(
c
)
==
this
.
input
.
value2str
(
this
.
value
))
return
this
.
$div
.
triggerHandler
(
"nochange"
),
void
0
;
var
e
=
this
.
input
.
value2submit
(
c
);
this
.
isSaving
=!
0
,
a
.
when
(
this
.
save
(
e
)).
done
(
a
.
proxy
(
function
(
a
){
this
.
isSaving
=!
1
;
var
b
=
"function"
==
typeof
this
.
options
.
success
?
this
.
options
.
success
.
call
(
this
.
options
.
scope
,
a
,
c
):
null
;
return
b
===!
1
?(
this
.
error
(
!
1
),
this
.
showForm
(
!
1
),
void
0
):
"string"
==
typeof
b
?(
this
.
error
(
b
),
this
.
showForm
(),
void
0
):(
b
&&
"object"
==
typeof
b
&&
b
.
hasOwnProperty
(
"newValue"
)
&&
(
c
=
b
.
newValue
),
this
.
error
(
!
1
),
this
.
value
=
c
,
this
.
$div
.
triggerHandler
(
"save"
,{
newValue
:
c
,
submitValue
:
e
,
response
:
a
}),
void
0
)},
this
)).
fail
(
a
.
proxy
(
function
(
a
){
this
.
isSaving
=!
1
;
var
b
;
b
=
"function"
==
typeof
this
.
options
.
error
?
this
.
options
.
error
.
call
(
this
.
options
.
scope
,
a
,
c
):
"string"
==
typeof
a
?
a
:
a
.
responseText
||
a
.
statusText
||
"Unknown error!"
,
this
.
error
(
b
),
this
.
showForm
()},
this
))},
save
:
function
(
b
){
this
.
options
.
pk
=
a
.
fn
.
editableutils
.
tryParseJson
(
this
.
options
.
pk
,
!
0
);
var
c
,
d
=
"function"
==
typeof
this
.
options
.
pk
?
this
.
options
.
pk
.
call
(
this
.
options
.
scope
):
this
.
options
.
pk
,
e
=!!
(
"function"
==
typeof
this
.
options
.
url
||
this
.
options
.
url
&&
(
"always"
===
this
.
options
.
send
||
"auto"
===
this
.
options
.
send
&&
null
!==
d
&&
void
0
!==
d
));
return
e
?(
this
.
showLoading
(),
c
=
{
name
:
this
.
options
.
name
||
""
,
value
:
b
,
pk
:
d
},
"function"
==
typeof
this
.
options
.
params
?
c
=
this
.
options
.
params
.
call
(
this
.
options
.
scope
,
c
):(
this
.
options
.
params
=
a
.
fn
.
editableutils
.
tryParseJson
(
this
.
options
.
params
,
!
0
),
a
.
extend
(
c
,
this
.
options
.
params
)),
"function"
==
typeof
this
.
options
.
url
?
this
.
options
.
url
.
call
(
this
.
options
.
scope
,
c
):
a
.
ajax
(
a
.
extend
({
url
:
this
.
options
.
url
,
data
:
c
,
type
:
"POST"
},
this
.
options
.
ajaxOptions
))):
void
0
},
validate
:
function
(
a
){
return
void
0
===
a
&&
(
a
=
this
.
value
),
"function"
==
typeof
this
.
options
.
validate
?
this
.
options
.
validate
.
call
(
this
.
options
.
scope
,
a
):
void
0
},
option
:
function
(
a
,
b
){
a
in
this
.
options
&&
(
this
.
options
[
a
]
=
b
),
"value"
===
a
&&
this
.
setValue
(
b
)},
setValue
:
function
(
a
,
b
){
this
.
value
=
b
?
this
.
input
.
str2value
(
a
):
a
,
this
.
$form
&&
this
.
$form
.
is
(
":visible"
)
&&
this
.
input
.
value2input
(
this
.
value
)}},
a
.
fn
.
editableform
=
function
(
c
){
var
d
=
arguments
;
return
this
.
each
(
function
(){
var
e
=
a
(
this
),
f
=
e
.
data
(
"editableform"
),
g
=
"object"
==
typeof
c
&&
c
;
f
||
e
.
data
(
"editableform"
,
f
=
new
b
(
this
,
g
)),
"string"
==
typeof
c
&&
f
[
c
].
apply
(
f
,
Array
.
prototype
.
slice
.
call
(
d
,
1
))})},
a
.
fn
.
editableform
.
Constructor
=
b
,
a
.
fn
.
editableform
.
defaults
=
{
type
:
"text"
,
url
:
null
,
params
:
null
,
name
:
null
,
pk
:
null
,
value
:
null
,
defaultValue
:
null
,
send
:
"auto"
,
validate
:
null
,
success
:
null
,
error
:
null
,
ajaxOptions
:
null
,
showbuttons
:
!
0
,
scope
:
null
,
savenochange
:
!
1
},
a
.
fn
.
editableform
.
template
=
'<form class="form-inline editableform"><div class="control-group"><div><div class="editable-input"></div><div class="editable-buttons"></div></div><div class="editable-error-block"></div></div></form>'
,
a
.
fn
.
editableform
.
loading
=
'<div class="editableform-loading"></div>'
,
a
.
fn
.
editableform
.
buttons
=
'<button type="submit" class="editable-submit">ok</button><button type="button" class="editable-cancel">cancel</button>'
,
a
.
fn
.
editableform
.
errorGroupClass
=
null
,
a
.
fn
.
editableform
.
errorBlockClass
=
"editable-error"
,
a
.
fn
.
editableform
.
engine
=
"jquery"
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
fn
.
editableutils
=
{
inherit
:
function
(
a
,
b
){
var
c
=
function
(){};
c
.
prototype
=
b
.
prototype
,
a
.
prototype
=
new
c
,
a
.
prototype
.
constructor
=
a
,
a
.
superclass
=
b
.
prototype
},
setCursorPosition
:
function
(
a
,
b
){
if
(
a
.
setSelectionRange
)
a
.
setSelectionRange
(
b
,
b
);
else
if
(
a
.
createTextRange
){
var
c
=
a
.
createTextRange
();
c
.
collapse
(
!
0
),
c
.
moveEnd
(
"character"
,
b
),
c
.
moveStart
(
"character"
,
b
),
c
.
select
()}},
tryParseJson
:
function
(
a
,
b
){
if
(
"string"
==
typeof
a
&&
a
.
length
&&
a
.
match
(
/^
[\{\[]
.*
[\}\]]
$/
))
if
(
b
)
try
{
a
=
new
Function
(
"return "
+
a
)()}
catch
(
c
){}
finally
{
return
a
}
else
a
=
new
Function
(
"return "
+
a
)();
return
a
},
sliceObj
:
function
(
b
,
c
,
d
){
var
e
,
f
,
g
=
{};
if
(
!
a
.
isArray
(
c
)
||!
c
.
length
)
return
g
;
for
(
var
h
=
0
;
h
<
c
.
length
;
h
++
)
e
=
c
[
h
],
b
.
hasOwnProperty
(
e
)
&&
(
g
[
e
]
=
b
[
e
]),
d
!==!
0
&&
(
f
=
e
.
toLowerCase
(),
b
.
hasOwnProperty
(
f
)
&&
(
g
[
e
]
=
b
[
f
]));
return
g
},
getConfigData
:
function
(
b
){
var
c
=
{};
return
a
.
each
(
b
.
data
(),
function
(
a
,
b
){(
"object"
!=
typeof
b
||
b
&&
"object"
==
typeof
b
&&
(
b
.
constructor
===
Object
||
b
.
constructor
===
Array
))
&&
(
c
[
a
]
=
b
)}),
c
},
objectKeys
:
function
(
a
){
if
(
Object
.
keys
)
return
Object
.
keys
(
a
);
if
(
a
!==
Object
(
a
))
throw
new
TypeError
(
"Object.keys called on a non-object"
);
var
b
,
c
=
[];
for
(
b
in
a
)
Object
.
prototype
.
hasOwnProperty
.
call
(
a
,
b
)
&&
c
.
push
(
b
);
return
c
},
escape
:
function
(
b
){
return
a
(
"<div>"
).
text
(
b
).
html
()},
itemsByValue
:
function
(
b
,
c
,
d
){
if
(
!
c
||
null
===
b
)
return
[];
if
(
"function"
!=
typeof
d
){
var
e
=
d
||
"value"
;
d
=
function
(
a
){
return
a
[
e
]}}
var
f
=
a
.
isArray
(
b
),
g
=
[],
h
=
this
;
return
a
.
each
(
c
,
function
(
c
,
e
){
if
(
e
.
children
)
g
=
g
.
concat
(
h
.
itemsByValue
(
b
,
e
.
children
,
d
));
else
if
(
f
)
a
.
grep
(
b
,
function
(
a
){
return
a
==
(
e
&&
"object"
==
typeof
e
?
d
(
e
):
e
)}).
length
&&
g
.
push
(
e
);
else
{
var
i
=
e
&&
"object"
==
typeof
e
?
d
(
e
):
e
;
b
==
i
&&
g
.
push
(
e
)}}),
g
},
createInput
:
function
(
b
){
var
c
,
d
,
e
,
f
=
b
.
type
;
return
"date"
===
f
&&
(
"inline"
===
b
.
mode
?
a
.
fn
.
editabletypes
.
datefield
?
f
=
"datefield"
:
a
.
fn
.
editabletypes
.
dateuifield
&&
(
f
=
"dateuifield"
):
a
.
fn
.
editabletypes
.
date
?
f
=
"date"
:
a
.
fn
.
editabletypes
.
dateui
&&
(
f
=
"dateui"
),
"date"
!==
f
||
a
.
fn
.
editabletypes
.
date
||
(
f
=
"combodate"
)),
"datetime"
===
f
&&
"inline"
===
b
.
mode
&&
(
f
=
"datetimefield"
),
"wysihtml5"
!==
f
||
a
.
fn
.
editabletypes
[
f
]
||
(
f
=
"textarea"
),
"function"
==
typeof
a
.
fn
.
editabletypes
[
f
]?(
c
=
a
.
fn
.
editabletypes
[
f
],
d
=
this
.
sliceObj
(
b
,
this
.
objectKeys
(
c
.
defaults
)),
e
=
new
c
(
d
)):(
a
.
error
(
"Unknown type: "
+
f
),
!
1
)},
supportsTransitions
:
function
(){
var
a
=
document
.
body
||
document
.
documentElement
,
b
=
a
.
style
,
c
=
"transition"
,
d
=
[
"Moz"
,
"Webkit"
,
"Khtml"
,
"O"
,
"ms"
];
if
(
"string"
==
typeof
b
[
c
])
return
!
0
;
c
=
c
.
charAt
(
0
).
toUpperCase
()
+
c
.
substr
(
1
);
for
(
var
e
=
0
;
e
<
d
.
length
;
e
++
)
if
(
"string"
==
typeof
b
[
d
[
e
]
+
c
])
return
!
0
;
return
!
1
}}}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
,
b
){
this
.
init
(
a
,
b
)},
c
=
function
(
a
,
b
){
this
.
init
(
a
,
b
)};
b
.
prototype
=
{
containerName
:
null
,
containerDataName
:
null
,
innerCss
:
null
,
containerClass
:
"editable-container editable-popup"
,
defaults
:{},
init
:
function
(
c
,
d
){
this
.
$element
=
a
(
c
),
this
.
options
=
a
.
extend
({},
a
.
fn
.
editableContainer
.
defaults
,
d
),
this
.
splitOptions
(),
this
.
formOptions
.
scope
=
this
.
$element
[
0
],
this
.
initContainer
(),
this
.
delayedHide
=!
1
,
this
.
$element
.
on
(
"destroyed"
,
a
.
proxy
(
function
(){
this
.
destroy
()},
this
)),
a
(
document
).
data
(
"editable-handlers-attached"
)
||
(
a
(
document
).
on
(
"keyup.editable"
,
function
(
b
){
27
===
b
.
which
&&
a
(
".editable-open"
).
editableContainer
(
"hide"
)}),
a
(
document
).
on
(
"click.editable"
,
function
(
c
){
var
d
,
e
=
a
(
c
.
target
),
f
=
[
".editable-container"
,
".ui-datepicker-header"
,
".datepicker"
,
".modal-backdrop"
,
".bootstrap-wysihtml5-insert-image-modal"
,
".bootstrap-wysihtml5-insert-link-modal"
];
if
(
a
.
contains
(
document
.
documentElement
,
c
.
target
)
&&!
e
.
is
(
document
)){
for
(
d
=
0
;
d
<
f
.
length
;
d
++
)
if
(
e
.
is
(
f
[
d
])
||
e
.
parents
(
f
[
d
]).
length
)
return
;
b
.
prototype
.
closeOthers
(
c
.
target
)}}),
a
(
document
).
data
(
"editable-handlers-attached"
,
!
0
))},
splitOptions
:
function
(){
if
(
this
.
containerOptions
=
{},
this
.
formOptions
=
{},
!
a
.
fn
[
this
.
containerName
])
throw
new
Error
(
this
.
containerName
+
" not found. Have you included corresponding js file?"
);
for
(
var
b
in
this
.
options
)
b
in
this
.
defaults
?
this
.
containerOptions
[
b
]
=
this
.
options
[
b
]:
this
.
formOptions
[
b
]
=
this
.
options
[
b
]},
tip
:
function
(){
return
this
.
container
()?
this
.
container
().
$tip
:
null
},
container
:
function
(){
var
a
;
return
this
.
containerDataName
&&
(
a
=
this
.
$element
.
data
(
this
.
containerDataName
))?
a
:
a
=
this
.
$element
.
data
(
this
.
containerName
)},
call
:
function
(){
this
.
$element
[
this
.
containerName
].
apply
(
this
.
$element
,
arguments
)},
initContainer
:
function
(){
this
.
call
(
this
.
containerOptions
)},
renderForm
:
function
(){
this
.
$form
.
editableform
(
this
.
formOptions
).
on
({
save
:
a
.
proxy
(
this
.
save
,
this
),
nochange
:
a
.
proxy
(
function
(){
this
.
hide
(
"nochange"
)},
this
),
cancel
:
a
.
proxy
(
function
(){
this
.
hide
(
"cancel"
)},
this
),
show
:
a
.
proxy
(
function
(){
this
.
delayedHide
?(
this
.
hide
(
this
.
delayedHide
.
reason
),
this
.
delayedHide
=!
1
):
this
.
setPosition
()},
this
),
rendering
:
a
.
proxy
(
this
.
setPosition
,
this
),
resize
:
a
.
proxy
(
this
.
setPosition
,
this
),
rendered
:
a
.
proxy
(
function
(){
this
.
$element
.
triggerHandler
(
"shown"
,
a
(
this
.
options
.
scope
).
data
(
"editable"
))},
this
)}).
editableform
(
"render"
)},
show
:
function
(
b
){
this
.
$element
.
addClass
(
"editable-open"
),
b
!==!
1
&&
this
.
closeOthers
(
this
.
$element
[
0
]),
this
.
innerShow
(),
this
.
tip
().
addClass
(
this
.
containerClass
),
this
.
$form
,
this
.
$form
=
a
(
"<div>"
),
this
.
tip
().
is
(
this
.
innerCss
)?
this
.
tip
().
append
(
this
.
$form
):
this
.
tip
().
find
(
this
.
innerCss
).
append
(
this
.
$form
),
this
.
renderForm
()},
hide
:
function
(
a
){
if
(
this
.
tip
()
&&
this
.
tip
().
is
(
":visible"
)
&&
this
.
$element
.
hasClass
(
"editable-open"
)){
if
(
this
.
$form
.
data
(
"editableform"
).
isSaving
)
return
this
.
delayedHide
=
{
reason
:
a
},
void
0
;
this
.
delayedHide
=!
1
,
this
.
$element
.
removeClass
(
"editable-open"
),
this
.
innerHide
(),
this
.
$element
.
triggerHandler
(
"hidden"
,
a
||
"manual"
)}},
innerShow
:
function
(){},
innerHide
:
function
(){},
toggle
:
function
(
a
){
this
.
container
()
&&
this
.
tip
()
&&
this
.
tip
().
is
(
":visible"
)?
this
.
hide
():
this
.
show
(
a
)},
setPosition
:
function
(){},
save
:
function
(
a
,
b
){
this
.
$element
.
triggerHandler
(
"save"
,
b
),
this
.
hide
(
"save"
)},
option
:
function
(
a
,
b
){
this
.
options
[
a
]
=
b
,
a
in
this
.
containerOptions
?(
this
.
containerOptions
[
a
]
=
b
,
this
.
setContainerOption
(
a
,
b
)):(
this
.
formOptions
[
a
]
=
b
,
this
.
$form
&&
this
.
$form
.
editableform
(
"option"
,
a
,
b
))},
setContainerOption
:
function
(
a
,
b
){
this
.
call
(
"option"
,
a
,
b
)},
destroy
:
function
(){
this
.
hide
(),
this
.
innerDestroy
(),
this
.
$element
.
off
(
"destroyed"
),
this
.
$element
.
removeData
(
"editableContainer"
)},
innerDestroy
:
function
(){},
closeOthers
:
function
(
b
){
a
(
".editable-open"
).
each
(
function
(
c
,
d
){
if
(
d
!==
b
&&!
a
(
d
).
find
(
b
).
length
){
var
e
=
a
(
d
),
f
=
e
.
data
(
"editableContainer"
);
f
&&
(
"cancel"
===
f
.
options
.
onblur
?
e
.
data
(
"editableContainer"
).
hide
(
"onblur"
):
"submit"
===
f
.
options
.
onblur
&&
e
.
data
(
"editableContainer"
).
tip
().
find
(
"form"
).
submit
())}})},
activate
:
function
(){
this
.
tip
&&
this
.
tip
().
is
(
":visible"
)
&&
this
.
$form
&&
this
.
$form
.
data
(
"editableform"
).
input
.
activate
()}},
a
.
fn
.
editableContainer
=
function
(
d
){
var
e
=
arguments
;
return
this
.
each
(
function
(){
var
f
=
a
(
this
),
g
=
"editableContainer"
,
h
=
f
.
data
(
g
),
i
=
"object"
==
typeof
d
&&
d
,
j
=
"inline"
===
i
.
mode
?
c
:
b
;
h
||
f
.
data
(
g
,
h
=
new
j
(
this
,
i
)),
"string"
==
typeof
d
&&
h
[
d
].
apply
(
h
,
Array
.
prototype
.
slice
.
call
(
e
,
1
))})},
a
.
fn
.
editableContainer
.
Popup
=
b
,
a
.
fn
.
editableContainer
.
Inline
=
c
,
a
.
fn
.
editableContainer
.
defaults
=
{
value
:
null
,
placement
:
"top"
,
autohide
:
!
0
,
onblur
:
"cancel"
,
anim
:
!
1
,
mode
:
"popup"
},
jQuery
.
event
.
special
.
destroyed
=
{
remove
:
function
(
a
){
a
.
handler
&&
a
.
handler
()}}}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
extend
(
a
.
fn
.
editableContainer
.
Inline
.
prototype
,
a
.
fn
.
editableContainer
.
Popup
.
prototype
,{
containerName
:
"editableform"
,
innerCss
:
".editable-inline"
,
containerClass
:
"editable-container editable-inline"
,
initContainer
:
function
(){
this
.
$tip
=
a
(
"<span></span>"
),
this
.
options
.
anim
||
(
this
.
options
.
anim
=
0
)},
splitOptions
:
function
(){
this
.
containerOptions
=
{},
this
.
formOptions
=
this
.
options
},
tip
:
function
(){
return
this
.
$tip
},
innerShow
:
function
(){
this
.
$element
.
hide
(),
this
.
tip
().
insertAfter
(
this
.
$element
).
show
()},
innerHide
:
function
(){
this
.
$tip
.
hide
(
this
.
options
.
anim
,
a
.
proxy
(
function
(){
this
.
$element
.
show
(),
this
.
innerDestroy
()},
this
))},
innerDestroy
:
function
(){
this
.
tip
()
&&
this
.
tip
().
empty
().
remove
()}})}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
b
,
c
){
this
.
$element
=
a
(
b
),
this
.
options
=
a
.
extend
({},
a
.
fn
.
editable
.
defaults
,
c
,
a
.
fn
.
editableutils
.
getConfigData
(
this
.
$element
)),
this
.
options
.
selector
?
this
.
initLive
():
this
.
init
(),
this
.
options
.
highlight
&&!
a
.
fn
.
editableutils
.
supportsTransitions
()
&&
(
this
.
options
.
highlight
=!
1
)};
b
.
prototype
=
{
constructor
:
b
,
init
:
function
(){
var
b
,
c
=!
1
;
if
(
this
.
options
.
name
=
this
.
options
.
name
||
this
.
$element
.
attr
(
"id"
),
this
.
options
.
scope
=
this
.
$element
[
0
],
this
.
input
=
a
.
fn
.
editableutils
.
createInput
(
this
.
options
),
this
.
input
){
switch
(
void
0
===
this
.
options
.
value
||
null
===
this
.
options
.
value
?(
this
.
value
=
this
.
input
.
html2value
(
a
.
trim
(
this
.
$element
.
html
())),
c
=!
0
):(
this
.
options
.
value
=
a
.
fn
.
editableutils
.
tryParseJson
(
this
.
options
.
value
,
!
0
),
this
.
value
=
"string"
==
typeof
this
.
options
.
value
?
this
.
input
.
str2value
(
this
.
options
.
value
):
this
.
options
.
value
),
this
.
$element
.
addClass
(
"editable"
),
"textarea"
===
this
.
input
.
type
&&
this
.
$element
.
addClass
(
"editable-pre-wrapped"
),
"manual"
!==
this
.
options
.
toggle
?(
this
.
$element
.
addClass
(
"editable-click"
),
this
.
$element
.
on
(
this
.
options
.
toggle
+
".editable"
,
a
.
proxy
(
function
(
a
){
if
(
this
.
options
.
disabled
||
a
.
preventDefault
(),
"mouseenter"
===
this
.
options
.
toggle
)
this
.
show
();
else
{
var
b
=
"click"
!==
this
.
options
.
toggle
;
this
.
toggle
(
b
)}},
this
))):
this
.
$element
.
attr
(
"tabindex"
,
-
1
),
"function"
==
typeof
this
.
options
.
display
&&
(
this
.
options
.
autotext
=
"always"
),
this
.
options
.
autotext
){
case
"always"
:
b
=!
0
;
break
;
case
"auto"
:
b
=!
a
.
trim
(
this
.
$element
.
text
()).
length
&&
null
!==
this
.
value
&&
void
0
!==
this
.
value
&&!
c
;
break
;
default
:
b
=!
1
}
a
.
when
(
b
?
this
.
render
():
!
0
).
then
(
a
.
proxy
(
function
(){
this
.
options
.
disabled
?
this
.
disable
():
this
.
enable
(),
this
.
$element
.
triggerHandler
(
"init"
,
this
)},
this
))}},
initLive
:
function
(){
var
b
=
this
.
options
.
selector
;
this
.
options
.
selector
=!
1
,
this
.
options
.
autotext
=
"never"
,
this
.
$element
.
on
(
this
.
options
.
toggle
+
".editable"
,
b
,
a
.
proxy
(
function
(
b
){
var
c
=
a
(
b
.
target
);
c
.
data
(
"editable"
)
||
(
c
.
hasClass
(
this
.
options
.
emptyclass
)
&&
c
.
empty
(),
c
.
editable
(
this
.
options
).
trigger
(
b
))},
this
))},
render
:
function
(
a
){
return
this
.
options
.
display
!==!
1
?
this
.
input
.
value2htmlFinal
?
this
.
input
.
value2html
(
this
.
value
,
this
.
$element
[
0
],
this
.
options
.
display
,
a
):
"function"
==
typeof
this
.
options
.
display
?
this
.
options
.
display
.
call
(
this
.
$element
[
0
],
this
.
value
,
a
):
this
.
input
.
value2html
(
this
.
value
,
this
.
$element
[
0
]):
void
0
},
enable
:
function
(){
this
.
options
.
disabled
=!
1
,
this
.
$element
.
removeClass
(
"editable-disabled"
),
this
.
handleEmpty
(
this
.
isEmpty
),
"manual"
!==
this
.
options
.
toggle
&&
"-1"
===
this
.
$element
.
attr
(
"tabindex"
)
&&
this
.
$element
.
removeAttr
(
"tabindex"
)},
disable
:
function
(){
this
.
options
.
disabled
=!
0
,
this
.
hide
(),
this
.
$element
.
addClass
(
"editable-disabled"
),
this
.
handleEmpty
(
this
.
isEmpty
),
this
.
$element
.
attr
(
"tabindex"
,
-
1
)},
toggleDisabled
:
function
(){
this
.
options
.
disabled
?
this
.
enable
():
this
.
disable
()},
option
:
function
(
b
,
c
){
return
b
&&
"object"
==
typeof
b
?(
a
.
each
(
b
,
a
.
proxy
(
function
(
b
,
c
){
this
.
option
(
a
.
trim
(
b
),
c
)},
this
)),
void
0
):(
this
.
options
[
b
]
=
c
,
"disabled"
===
b
?
c
?
this
.
disable
():
this
.
enable
():(
"value"
===
b
&&
this
.
setValue
(
c
),
this
.
container
&&
this
.
container
.
option
(
b
,
c
),
this
.
input
.
option
&&
this
.
input
.
option
(
b
,
c
),
void
0
))},
handleEmpty
:
function
(
b
){
this
.
options
.
display
!==!
1
&&
(
this
.
isEmpty
=
void
0
!==
b
?
b
:
"function"
==
typeof
this
.
input
.
isEmpty
?
this
.
input
.
isEmpty
(
this
.
$element
):
""
===
a
.
trim
(
this
.
$element
.
html
()),
this
.
options
.
disabled
?
this
.
isEmpty
&&
(
this
.
$element
.
empty
(),
this
.
options
.
emptyclass
&&
this
.
$element
.
removeClass
(
this
.
options
.
emptyclass
)):
this
.
isEmpty
?(
this
.
$element
.
html
(
this
.
options
.
emptytext
),
this
.
options
.
emptyclass
&&
this
.
$element
.
addClass
(
this
.
options
.
emptyclass
)):
this
.
options
.
emptyclass
&&
this
.
$element
.
removeClass
(
this
.
options
.
emptyclass
))},
show
:
function
(
b
){
if
(
!
this
.
options
.
disabled
){
if
(
this
.
container
){
if
(
this
.
container
.
tip
().
is
(
":visible"
))
return
}
else
{
var
c
=
a
.
extend
({},
this
.
options
,{
value
:
this
.
value
,
input
:
this
.
input
});
this
.
$element
.
editableContainer
(
c
),
this
.
$element
.
on
(
"save.internal"
,
a
.
proxy
(
this
.
save
,
this
)),
this
.
container
=
this
.
$element
.
data
(
"editableContainer"
)}
this
.
container
.
show
(
b
)}},
hide
:
function
(){
this
.
container
&&
this
.
container
.
hide
()},
toggle
:
function
(
a
){
this
.
container
&&
this
.
container
.
tip
().
is
(
":visible"
)?
this
.
hide
():
this
.
show
(
a
)},
save
:
function
(
a
,
b
){
if
(
this
.
options
.
unsavedclass
){
var
c
=!
1
;
c
=
c
||
"function"
==
typeof
this
.
options
.
url
,
c
=
c
||
this
.
options
.
display
===!
1
,
c
=
c
||
void
0
!==
b
.
response
,
c
=
c
||
this
.
options
.
savenochange
&&
this
.
input
.
value2str
(
this
.
value
)
!==
this
.
input
.
value2str
(
b
.
newValue
),
c
?
this
.
$element
.
removeClass
(
this
.
options
.
unsavedclass
):
this
.
$element
.
addClass
(
this
.
options
.
unsavedclass
)}
if
(
this
.
options
.
highlight
){
var
d
=
this
.
$element
,
e
=
d
.
css
(
"background-color"
);
d
.
css
(
"background-color"
,
this
.
options
.
highlight
),
setTimeout
(
function
(){
"transparent"
===
e
&&
(
e
=
""
),
d
.
css
(
"background-color"
,
e
),
d
.
addClass
(
"editable-bg-transition"
),
setTimeout
(
function
(){
d
.
removeClass
(
"editable-bg-transition"
)},
1700
)},
10
)}
this
.
setValue
(
b
.
newValue
,
!
1
,
b
.
response
)},
validate
:
function
(){
return
"function"
==
typeof
this
.
options
.
validate
?
this
.
options
.
validate
.
call
(
this
,
this
.
value
):
void
0
},
setValue
:
function
(
b
,
c
,
d
){
this
.
value
=
c
?
this
.
input
.
str2value
(
b
):
b
,
this
.
container
&&
this
.
container
.
option
(
"value"
,
this
.
value
),
a
.
when
(
this
.
render
(
d
)).
then
(
a
.
proxy
(
function
(){
this
.
handleEmpty
()},
this
))},
activate
:
function
(){
this
.
container
&&
this
.
container
.
activate
()},
destroy
:
function
(){
this
.
disable
(),
this
.
container
&&
this
.
container
.
destroy
(),
this
.
input
.
destroy
(),
"manual"
!==
this
.
options
.
toggle
&&
(
this
.
$element
.
removeClass
(
"editable-click"
),
this
.
$element
.
off
(
this
.
options
.
toggle
+
".editable"
)),
this
.
$element
.
off
(
"save.internal"
),
this
.
$element
.
removeClass
(
"editable editable-open editable-disabled"
),
this
.
$element
.
removeData
(
"editable"
)}},
a
.
fn
.
editable
=
function
(
c
){
var
d
=
{},
e
=
arguments
,
f
=
"editable"
;
switch
(
c
){
case
"validate"
:
return
this
.
each
(
function
(){
var
b
,
c
=
a
(
this
),
e
=
c
.
data
(
f
);
e
&&
(
b
=
e
.
validate
())
&&
(
d
[
e
.
options
.
name
]
=
b
)}),
d
;
case
"getValue"
:
return
2
===
arguments
.
length
&&
arguments
[
1
]
===!
0
?
d
=
this
.
eq
(
0
).
data
(
f
).
value
:
this
.
each
(
function
(){
var
b
=
a
(
this
),
c
=
b
.
data
(
f
);
c
&&
void
0
!==
c
.
value
&&
null
!==
c
.
value
&&
(
d
[
c
.
options
.
name
]
=
c
.
input
.
value2submit
(
c
.
value
))}),
d
;
case
"submit"
:
var
g
=
arguments
[
1
]
||
{},
h
=
this
,
i
=
this
.
editable
(
"validate"
);
if
(
a
.
isEmptyObject
(
i
)){
var
j
=
{};
if
(
1
===
h
.
length
){
var
k
=
h
.
data
(
"editable"
),
l
=
{
name
:
k
.
options
.
name
||
""
,
value
:
k
.
input
.
value2submit
(
k
.
value
),
pk
:
"function"
==
typeof
k
.
options
.
pk
?
k
.
options
.
pk
.
call
(
k
.
options
.
scope
):
k
.
options
.
pk
};
"function"
==
typeof
k
.
options
.
params
?
l
=
k
.
options
.
params
.
call
(
k
.
options
.
scope
,
l
):(
k
.
options
.
params
=
a
.
fn
.
editableutils
.
tryParseJson
(
k
.
options
.
params
,
!
0
),
a
.
extend
(
l
,
k
.
options
.
params
)),
j
=
{
url
:
k
.
options
.
url
,
data
:
l
,
type
:
"POST"
},
g
.
success
=
g
.
success
||
k
.
options
.
success
,
g
.
error
=
g
.
error
||
k
.
options
.
error
}
else
{
var
m
=
this
.
editable
(
"getValue"
);
j
=
{
url
:
g
.
url
,
data
:
m
,
type
:
"POST"
}}
j
.
success
=
"function"
==
typeof
g
.
success
?
function
(
a
){
g
.
success
.
call
(
h
,
a
,
g
)}:
a
.
noop
,
j
.
error
=
"function"
==
typeof
g
.
error
?
function
(){
g
.
error
.
apply
(
h
,
arguments
)}:
a
.
noop
,
g
.
ajaxOptions
&&
a
.
extend
(
j
,
g
.
ajaxOptions
),
g
.
data
&&
a
.
extend
(
j
.
data
,
g
.
data
),
a
.
ajax
(
j
)}
else
"function"
==
typeof
g
.
error
&&
g
.
error
.
call
(
h
,
i
);
return
this
}
return
this
.
each
(
function
(){
var
d
=
a
(
this
),
g
=
d
.
data
(
f
),
h
=
"object"
==
typeof
c
&&
c
;
return
h
&&
h
.
selector
?(
g
=
new
b
(
this
,
h
),
void
0
):(
g
||
d
.
data
(
f
,
g
=
new
b
(
this
,
h
)),
"string"
==
typeof
c
&&
g
[
c
].
apply
(
g
,
Array
.
prototype
.
slice
.
call
(
e
,
1
)),
void
0
)})},
a
.
fn
.
editable
.
defaults
=
{
type
:
"text"
,
disabled
:
!
1
,
toggle
:
"click"
,
emptytext
:
"Empty"
,
autotext
:
"auto"
,
value
:
null
,
display
:
null
,
emptyclass
:
"editable-empty"
,
unsavedclass
:
"editable-unsaved"
,
selector
:
null
,
highlight
:
"#FFFF80"
}}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
fn
.
editabletypes
=
{};
var
b
=
function
(){};
b
.
prototype
=
{
init
:
function
(
b
,
c
,
d
){
this
.
type
=
b
,
this
.
options
=
a
.
extend
({},
d
,
c
)},
prerender
:
function
(){
this
.
$tpl
=
a
(
this
.
options
.
tpl
),
this
.
$input
=
this
.
$tpl
,
this
.
$clear
=
null
,
this
.
error
=
null
},
render
:
function
(){},
value2html
:
function
(
b
,
c
){
a
(
c
)[
this
.
options
.
escape
?
"text"
:
"html"
](
a
.
trim
(
b
))},
html2value
:
function
(
b
){
return
a
(
"<div>"
).
html
(
b
).
text
()},
value2str
:
function
(
a
){
return
a
},
str2value
:
function
(
a
){
return
a
},
value2submit
:
function
(
a
){
return
a
},
value2input
:
function
(
a
){
this
.
$input
.
val
(
a
)},
input2value
:
function
(){
return
this
.
$input
.
val
()},
activate
:
function
(){
this
.
$input
.
is
(
":visible"
)
&&
this
.
$input
.
focus
()},
clear
:
function
(){
this
.
$input
.
val
(
null
)},
escape
:
function
(
b
){
return
a
(
"<div>"
).
text
(
b
).
html
()},
autosubmit
:
function
(){},
destroy
:
function
(){},
setClass
:
function
(){
this
.
options
.
inputclass
&&
this
.
$input
.
addClass
(
this
.
options
.
inputclass
)},
setAttr
:
function
(
a
){
void
0
!==
this
.
options
[
a
]
&&
null
!==
this
.
options
[
a
]
&&
this
.
$input
.
attr
(
a
,
this
.
options
[
a
])},
option
:
function
(
a
,
b
){
this
.
options
[
a
]
=
b
}},
b
.
defaults
=
{
tpl
:
""
,
inputclass
:
null
,
escape
:
!
0
,
scope
:
null
,
showbuttons
:
!
0
},
a
.
extend
(
a
.
fn
.
editabletypes
,{
abstractinput
:
b
})}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(){};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
var
b
=
a
.
Deferred
();
return
this
.
error
=
null
,
this
.
onSourceReady
(
function
(){
this
.
renderList
(),
b
.
resolve
()},
function
(){
this
.
error
=
this
.
options
.
sourceError
,
b
.
resolve
()}),
b
.
promise
()},
html2value
:
function
(){
return
null
},
value2html
:
function
(
b
,
c
,
d
,
e
){
var
f
=
a
.
Deferred
(),
g
=
function
(){
"function"
==
typeof
d
?
d
.
call
(
c
,
b
,
this
.
sourceData
,
e
):
this
.
value2htmlFinal
(
b
,
c
),
f
.
resolve
()};
return
null
===
b
?
g
.
call
(
this
):
this
.
onSourceReady
(
g
,
function
(){
f
.
resolve
()}),
f
.
promise
()},
onSourceReady
:
function
(
b
,
c
){
var
d
;
if
(
a
.
isFunction
(
this
.
options
.
source
)?(
d
=
this
.
options
.
source
.
call
(
this
.
options
.
scope
),
this
.
sourceData
=
null
):
d
=
this
.
options
.
source
,
this
.
options
.
sourceCache
&&
a
.
isArray
(
this
.
sourceData
))
return
b
.
call
(
this
),
void
0
;
try
{
d
=
a
.
fn
.
editableutils
.
tryParseJson
(
d
,
!
1
)}
catch
(
e
){
return
c
.
call
(
this
),
void
0
}
if
(
"string"
==
typeof
d
){
if
(
this
.
options
.
sourceCache
){
var
f
,
g
=
d
;
if
(
a
(
document
).
data
(
g
)
||
a
(
document
).
data
(
g
,{}),
f
=
a
(
document
).
data
(
g
),
f
.
loading
===!
1
&&
f
.
sourceData
)
return
this
.
sourceData
=
f
.
sourceData
,
this
.
doPrepend
(),
b
.
call
(
this
),
void
0
;
if
(
f
.
loading
===!
0
)
return
f
.
callbacks
.
push
(
a
.
proxy
(
function
(){
this
.
sourceData
=
f
.
sourceData
,
this
.
doPrepend
(),
b
.
call
(
this
)},
this
)),
f
.
err_callbacks
.
push
(
a
.
proxy
(
c
,
this
)),
void
0
;
f
.
loading
=!
0
,
f
.
callbacks
=
[],
f
.
err_callbacks
=
[]}
var
h
=
a
.
extend
({
url
:
d
,
type
:
"get"
,
cache
:
!
1
,
dataType
:
"json"
,
success
:
a
.
proxy
(
function
(
d
){
f
&&
(
f
.
loading
=!
1
),
this
.
sourceData
=
this
.
makeArray
(
d
),
a
.
isArray
(
this
.
sourceData
)?(
f
&&
(
f
.
sourceData
=
this
.
sourceData
,
a
.
each
(
f
.
callbacks
,
function
(){
this
.
call
()})),
this
.
doPrepend
(),
b
.
call
(
this
)):(
c
.
call
(
this
),
f
&&
a
.
each
(
f
.
err_callbacks
,
function
(){
this
.
call
()}))},
this
),
error
:
a
.
proxy
(
function
(){
c
.
call
(
this
),
f
&&
(
f
.
loading
=!
1
,
a
.
each
(
f
.
err_callbacks
,
function
(){
this
.
call
()}))},
this
)},
this
.
options
.
sourceOptions
);
a
.
ajax
(
h
)}
else
this
.
sourceData
=
this
.
makeArray
(
d
),
a
.
isArray
(
this
.
sourceData
)?(
this
.
doPrepend
(),
b
.
call
(
this
)):
c
.
call
(
this
)},
doPrepend
:
function
(){
null
!==
this
.
options
.
prepend
&&
void
0
!==
this
.
options
.
prepend
&&
(
a
.
isArray
(
this
.
prependData
)
||
(
a
.
isFunction
(
this
.
options
.
prepend
)
&&
(
this
.
options
.
prepend
=
this
.
options
.
prepend
.
call
(
this
.
options
.
scope
)),
this
.
options
.
prepend
=
a
.
fn
.
editableutils
.
tryParseJson
(
this
.
options
.
prepend
,
!
0
),
"string"
==
typeof
this
.
options
.
prepend
&&
(
this
.
options
.
prepend
=
{
""
:
this
.
options
.
prepend
}),
this
.
prependData
=
this
.
makeArray
(
this
.
options
.
prepend
)),
a
.
isArray
(
this
.
prependData
)
&&
a
.
isArray
(
this
.
sourceData
)
&&
(
this
.
sourceData
=
this
.
prependData
.
concat
(
this
.
sourceData
)))},
renderList
:
function
(){},
value2htmlFinal
:
function
(){},
makeArray
:
function
(
b
){
var
c
,
d
,
e
,
f
,
g
=
[];
if
(
!
b
||
"string"
==
typeof
b
)
return
null
;
if
(
a
.
isArray
(
b
)){
f
=
function
(
a
,
b
){
return
d
=
{
value
:
a
,
text
:
b
},
c
++>=
2
?
!
1
:
void
0
};
for
(
var
h
=
0
;
h
<
b
.
length
;
h
++
)
e
=
b
[
h
],
"object"
==
typeof
e
?(
c
=
0
,
a
.
each
(
e
,
f
),
1
===
c
?
g
.
push
(
d
):
c
>
1
&&
(
e
.
children
&&
(
e
.
children
=
this
.
makeArray
(
e
.
children
)),
g
.
push
(
e
))):
g
.
push
({
value
:
e
,
text
:
e
})}
else
a
.
each
(
b
,
function
(
a
,
b
){
g
.
push
({
value
:
a
,
text
:
b
})});
return
g
},
option
:
function
(
a
,
b
){
this
.
options
[
a
]
=
b
,
"source"
===
a
&&
(
this
.
sourceData
=
null
),
"prepend"
===
a
&&
(
this
.
prependData
=
null
)}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
source
:
null
,
prepend
:
!
1
,
sourceError
:
"Error when loading list"
,
sourceCache
:
!
0
,
sourceOptions
:
null
}),
a
.
fn
.
editabletypes
.
list
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"text"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
renderClear
(),
this
.
setClass
(),
this
.
setAttr
(
"placeholder"
)},
activate
:
function
(){
this
.
$input
.
is
(
":visible"
)
&&
(
this
.
$input
.
focus
(),
a
.
fn
.
editableutils
.
setCursorPosition
(
this
.
$input
.
get
(
0
),
this
.
$input
.
val
().
length
),
this
.
toggleClear
&&
this
.
toggleClear
())},
renderClear
:
function
(){
this
.
options
.
clear
&&
(
this
.
$clear
=
a
(
'<span class="editable-clear-x"></span>'
),
this
.
$input
.
after
(
this
.
$clear
).
css
(
"padding-right"
,
24
).
keyup
(
a
.
proxy
(
function
(
b
){
if
(
!~
a
.
inArray
(
b
.
keyCode
,[
40
,
38
,
9
,
13
,
27
])){
clearTimeout
(
this
.
t
);
var
c
=
this
;
this
.
t
=
setTimeout
(
function
(){
c
.
toggleClear
(
b
)},
100
)}},
this
)).
parent
().
css
(
"position"
,
"relative"
),
this
.
$clear
.
click
(
a
.
proxy
(
this
.
clear
,
this
)))},
postrender
:
function
(){},
toggleClear
:
function
(){
if
(
this
.
$clear
){
var
a
=
this
.
$input
.
val
().
length
,
b
=
this
.
$clear
.
is
(
":visible"
);
a
&&!
b
&&
this
.
$clear
.
show
(),
!
a
&&
b
&&
this
.
$clear
.
hide
()}},
clear
:
function
(){
this
.
$clear
.
hide
(),
this
.
$input
.
val
(
""
).
focus
()}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<input type="text">'
,
placeholder
:
null
,
clear
:
!
0
}),
a
.
fn
.
editabletypes
.
text
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"textarea"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
setClass
(),
this
.
setAttr
(
"placeholder"
),
this
.
setAttr
(
"rows"
),
this
.
$input
.
keydown
(
function
(
b
){
b
.
ctrlKey
&&
13
===
b
.
which
&&
a
(
this
).
closest
(
"form"
).
submit
()})},
activate
:
function
(){
a
.
fn
.
editabletypes
.
text
.
prototype
.
activate
.
call
(
this
)}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
"<textarea></textarea>"
,
inputclass
:
"input-large"
,
placeholder
:
null
,
rows
:
7
}),
a
.
fn
.
editabletypes
.
textarea
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"select"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
list
),
a
.
extend
(
b
.
prototype
,{
renderList
:
function
(){
this
.
$input
.
empty
();
var
b
=
function
(
c
,
d
){
var
e
;
if
(
a
.
isArray
(
d
))
for
(
var
f
=
0
;
f
<
d
.
length
;
f
++
)
e
=
{},
d
[
f
].
children
?(
e
.
label
=
d
[
f
].
text
,
c
.
append
(
b
(
a
(
"<optgroup>"
,
e
),
d
[
f
].
children
))):(
e
.
value
=
d
[
f
].
value
,
d
[
f
].
disabled
&&
(
e
.
disabled
=!
0
),
c
.
append
(
a
(
"<option>"
,
e
).
text
(
d
[
f
].
text
)));
return
c
};
b
(
this
.
$input
,
this
.
sourceData
),
this
.
setClass
(),
this
.
$input
.
on
(
"keydown.editable"
,
function
(
b
){
13
===
b
.
which
&&
a
(
this
).
closest
(
"form"
).
submit
()})},
value2htmlFinal
:
function
(
b
,
c
){
var
d
=
""
,
e
=
a
.
fn
.
editableutils
.
itemsByValue
(
b
,
this
.
sourceData
);
e
.
length
&&
(
d
=
e
[
0
].
text
),
a
.
fn
.
editabletypes
.
abstractinput
.
prototype
.
value2html
.
call
(
this
,
d
,
c
)},
autosubmit
:
function
(){
this
.
$input
.
off
(
"keydown.editable"
).
on
(
"change.editable"
,
function
(){
a
(
this
).
closest
(
"form"
).
submit
()})}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
list
.
defaults
,{
tpl
:
"<select></select>"
}),
a
.
fn
.
editabletypes
.
select
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"checklist"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
list
),
a
.
extend
(
b
.
prototype
,{
renderList
:
function
(){
var
b
;
if
(
this
.
$tpl
.
empty
(),
a
.
isArray
(
this
.
sourceData
)){
for
(
var
c
=
0
;
c
<
this
.
sourceData
.
length
;
c
++
)
b
=
a
(
"<label>"
).
append
(
a
(
"<input>"
,{
type
:
"checkbox"
,
value
:
this
.
sourceData
[
c
].
value
})).
append
(
a
(
"<span>"
).
text
(
" "
+
this
.
sourceData
[
c
].
text
)),
a
(
"<div>"
).
append
(
b
).
appendTo
(
this
.
$tpl
);
this
.
$input
=
this
.
$tpl
.
find
(
'input[type="checkbox"]'
),
this
.
setClass
()}},
value2str
:
function
(
b
){
return
a
.
isArray
(
b
)?
b
.
sort
().
join
(
a
.
trim
(
this
.
options
.
separator
)):
""
},
str2value
:
function
(
b
){
var
c
,
d
=
null
;
return
"string"
==
typeof
b
&&
b
.
length
?(
c
=
new
RegExp
(
"
\\
s*"
+
a
.
trim
(
this
.
options
.
separator
)
+
"
\\
s*"
),
d
=
b
.
split
(
c
)):
d
=
a
.
isArray
(
b
)?
b
:[
b
],
d
},
value2input
:
function
(
b
){
this
.
$input
.
prop
(
"checked"
,
!
1
),
a
.
isArray
(
b
)
&&
b
.
length
&&
this
.
$input
.
each
(
function
(
c
,
d
){
var
e
=
a
(
d
);
a
.
each
(
b
,
function
(
a
,
b
){
e
.
val
()
==
b
&&
e
.
prop
(
"checked"
,
!
0
)})})},
input2value
:
function
(){
var
b
=
[];
return
this
.
$input
.
filter
(
":checked"
).
each
(
function
(
c
,
d
){
b
.
push
(
a
(
d
).
val
())}),
b
},
value2htmlFinal
:
function
(
b
,
c
){
var
d
=
[],
e
=
a
.
fn
.
editableutils
.
itemsByValue
(
b
,
this
.
sourceData
),
f
=
this
.
options
.
escape
;
e
.
length
?(
a
.
each
(
e
,
function
(
b
,
c
){
var
e
=
f
?
a
.
fn
.
editableutils
.
escape
(
c
.
text
):
c
.
text
;
d
.
push
(
e
)}),
a
(
c
).
html
(
d
.
join
(
"<br>"
))):
a
(
c
).
empty
()},
activate
:
function
(){
this
.
$input
.
first
().
focus
()},
autosubmit
:
function
(){
this
.
$input
.
on
(
"keydown"
,
function
(
b
){
13
===
b
.
which
&&
a
(
this
).
closest
(
"form"
).
submit
()})}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
list
.
defaults
,{
tpl
:
'<div class="editable-checklist"></div>'
,
inputclass
:
null
,
separator
:
","
}),
a
.
fn
.
editabletypes
.
checklist
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"password"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
a
.
extend
(
b
.
prototype
,{
value2html
:
function
(
b
,
c
){
b
?
a
(
c
).
text
(
"[hidden]"
):
a
(
c
).
empty
()},
html2value
:
function
(){
return
null
}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="password">'
}),
a
.
fn
.
editabletypes
.
password
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"email"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="email">'
}),
a
.
fn
.
editabletypes
.
email
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"url"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="url">'
}),
a
.
fn
.
editabletypes
.
url
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"tel"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="tel">'
}),
a
.
fn
.
editabletypes
.
tel
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"number"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
text
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
b
.
superclass
.
render
.
call
(
this
),
this
.
setAttr
(
"min"
),
this
.
setAttr
(
"max"
),
this
.
setAttr
(
"step"
)},
postrender
:
function
(){
this
.
$clear
&&
this
.
$clear
.
css
({
right
:
24
})}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
text
.
defaults
,{
tpl
:
'<input type="number">'
,
inputclass
:
"input-mini"
,
min
:
null
,
max
:
null
,
step
:
null
}),
a
.
fn
.
editabletypes
.
number
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"range"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
number
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
$input
=
this
.
$tpl
.
filter
(
"input"
),
this
.
setClass
(),
this
.
setAttr
(
"min"
),
this
.
setAttr
(
"max"
),
this
.
setAttr
(
"step"
),
this
.
$input
.
on
(
"input"
,
function
(){
a
(
this
).
siblings
(
"output"
).
text
(
a
(
this
).
val
())})},
activate
:
function
(){
this
.
$input
.
focus
()}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
number
.
defaults
,{
tpl
:
'<input type="range"><output style="width: 30px; display: inline-block"></output>'
,
inputclass
:
"input-medium"
}),
a
.
fn
.
editabletypes
.
range
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"time"
,
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
setClass
()}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<input type="time">'
}),
a
.
fn
.
editabletypes
.
time
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
c
){
if
(
this
.
init
(
"select2"
,
c
,
b
.
defaults
),
c
.
select2
=
c
.
select2
||
{},
this
.
sourceData
=
null
,
c
.
placeholder
&&
(
c
.
select2
.
placeholder
=
c
.
placeholder
),
!
c
.
select2
.
tags
&&
c
.
source
){
var
d
=
c
.
source
;
a
.
isFunction
(
c
.
source
)
&&
(
d
=
c
.
source
.
call
(
c
.
scope
)),
"string"
==
typeof
d
?(
c
.
select2
.
ajax
=
c
.
select2
.
ajax
||
{},
c
.
select2
.
ajax
.
data
||
(
c
.
select2
.
ajax
.
data
=
function
(
a
){
return
{
query
:
a
}}),
c
.
select2
.
ajax
.
results
||
(
c
.
select2
.
ajax
.
results
=
function
(
a
){
return
{
results
:
a
}}),
c
.
select2
.
ajax
.
url
=
d
):(
this
.
sourceData
=
this
.
convertSource
(
d
),
c
.
select2
.
data
=
this
.
sourceData
)}
if
(
this
.
options
.
select2
=
a
.
extend
({},
b
.
defaults
.
select2
,
c
.
select2
),
this
.
isMultiple
=
this
.
options
.
select2
.
tags
||
this
.
options
.
select2
.
multiple
,
this
.
isRemote
=
"ajax"
in
this
.
options
.
select2
,
this
.
idFunc
=
this
.
options
.
select2
.
id
,
"function"
!=
typeof
this
.
idFunc
){
var
e
=
this
.
idFunc
||
"id"
;
this
.
idFunc
=
function
(
a
){
return
a
[
e
]}}
this
.
formatSelection
=
this
.
options
.
select2
.
formatSelection
,
"function"
!=
typeof
this
.
formatSelection
&&
(
this
.
formatSelection
=
function
(
a
){
return
a
.
text
})};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
setClass
(),
this
.
isRemote
&&
this
.
$input
.
on
(
"select2-loaded"
,
a
.
proxy
(
function
(
a
){
this
.
sourceData
=
a
.
items
.
results
},
this
)),
this
.
isMultiple
&&
this
.
$input
.
on
(
"change"
,
function
(){
a
(
this
).
closest
(
"form"
).
parent
().
triggerHandler
(
"resize"
)})},
value2html
:
function
(
c
,
d
){
var
e
,
f
=
""
,
g
=
this
;
this
.
options
.
select2
.
tags
?
e
=
c
:
this
.
sourceData
&&
(
e
=
a
.
fn
.
editableutils
.
itemsByValue
(
c
,
this
.
sourceData
,
this
.
idFunc
)),
a
.
isArray
(
e
)?(
f
=
[],
a
.
each
(
e
,
function
(
a
,
b
){
f
.
push
(
b
&&
"object"
==
typeof
b
?
g
.
formatSelection
(
b
):
b
)})):
e
&&
(
f
=
g
.
formatSelection
(
e
)),
f
=
a
.
isArray
(
f
)?
f
.
join
(
this
.
options
.
viewseparator
):
f
,
b
.
superclass
.
value2html
.
call
(
this
,
f
,
d
)},
html2value
:
function
(
a
){
return
this
.
options
.
select2
.
tags
?
this
.
str2value
(
a
,
this
.
options
.
viewseparator
):
null
},
value2input
:
function
(
b
){
if
(
a
.
isArray
(
b
)
&&
(
b
=
b
.
join
(
this
.
getSeparator
())),
this
.
$input
.
data
(
"select2"
)?
this
.
$input
.
val
(
b
).
trigger
(
"change"
,
!
0
):(
this
.
$input
.
val
(
b
),
this
.
$input
.
select2
(
this
.
options
.
select2
)),
this
.
isRemote
&&!
this
.
isMultiple
&&!
this
.
options
.
select2
.
initSelection
){
var
c
=
this
.
options
.
select2
.
id
,
d
=
this
.
options
.
select2
.
formatSelection
;
if
(
!
c
&&!
d
){
var
e
=
a
(
this
.
options
.
scope
);
if
(
!
e
.
data
(
"editable"
).
isEmpty
){
var
f
=
{
id
:
b
,
text
:
e
.
text
()};
this
.
$input
.
select2
(
"data"
,
f
)}}}},
input2value
:
function
(){
return
this
.
$input
.
select2
(
"val"
)},
str2value
:
function
(
b
,
c
){
if
(
"string"
!=
typeof
b
||!
this
.
isMultiple
)
return
b
;
c
=
c
||
this
.
getSeparator
();
var
d
,
e
,
f
;
if
(
null
===
b
||
b
.
length
<
1
)
return
null
;
for
(
d
=
b
.
split
(
c
),
e
=
0
,
f
=
d
.
length
;
f
>
e
;
e
+=
1
)
d
[
e
]
=
a
.
trim
(
d
[
e
]);
return
d
},
autosubmit
:
function
(){
this
.
$input
.
on
(
"change"
,
function
(
b
,
c
){
c
||
a
(
this
).
closest
(
"form"
).
submit
()})},
getSeparator
:
function
(){
return
this
.
options
.
select2
.
separator
||
a
.
fn
.
select2
.
defaults
.
separator
},
convertSource
:
function
(
b
){
if
(
a
.
isArray
(
b
)
&&
b
.
length
&&
void
0
!==
b
[
0
].
value
)
for
(
var
c
=
0
;
c
<
b
.
length
;
c
++
)
void
0
!==
b
[
c
].
value
&&
(
b
[
c
].
id
=
b
[
c
].
value
,
delete
b
[
c
].
value
);
return
b
},
destroy
:
function
(){
this
.
$input
.
data
(
"select2"
)
&&
this
.
$input
.
select2
(
"destroy"
)}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<input type="hidden">'
,
select2
:
null
,
placeholder
:
null
,
source
:
null
,
viewseparator
:
", "
}),
a
.
fn
.
editabletypes
.
select2
=
b
}(
window
.
jQuery
),
function
(
a
){
var
b
=
function
(
b
,
c
){
return
this
.
$element
=
a
(
b
),
this
.
$element
.
is
(
"input"
)?(
this
.
options
=
a
.
extend
({},
a
.
fn
.
combodate
.
defaults
,
c
,
this
.
$element
.
data
()),
this
.
init
(),
void
0
):(
a
.
error
(
"Combodate should be applied to INPUT element"
),
void
0
)};
b
.
prototype
=
{
constructor
:
b
,
init
:
function
(){
this
.
map
=
{
day
:[
"D"
,
"date"
],
month
:[
"M"
,
"month"
],
year
:[
"Y"
,
"year"
],
hour
:[
"[Hh]"
,
"hours"
],
minute
:[
"m"
,
"minutes"
],
second
:[
"s"
,
"seconds"
],
ampm
:[
"[Aa]"
,
""
]},
this
.
$widget
=
a
(
'<span class="combodate"></span>'
).
html
(
this
.
getTemplate
()),
this
.
initCombos
(),
this
.
$widget
.
on
(
"change"
,
"select"
,
a
.
proxy
(
function
(
b
){
this
.
$element
.
val
(
this
.
getValue
()).
change
(),
this
.
options
.
smartDays
&&
(
a
(
b
.
target
).
is
(
".month"
)
||
a
(
b
.
target
).
is
(
".year"
))
&&
this
.
fillCombo
(
"day"
)},
this
)),
this
.
$widget
.
find
(
"select"
).
css
(
"width"
,
"auto"
),
this
.
$element
.
hide
().
after
(
this
.
$widget
),
this
.
setValue
(
this
.
$element
.
val
()
||
this
.
options
.
value
)},
getTemplate
:
function
(){
var
b
=
this
.
options
.
template
;
return
a
.
each
(
this
.
map
,
function
(
a
,
c
){
c
=
c
[
0
];
var
d
=
new
RegExp
(
c
+
"+"
),
e
=
c
.
length
>
1
?
c
.
substring
(
1
,
2
):
c
;
b
=
b
.
replace
(
d
,
"{"
+
e
+
"}"
)}),
b
=
b
.
replace
(
/ /g
,
" "
),
a
.
each
(
this
.
map
,
function
(
a
,
c
){
c
=
c
[
0
];
var
d
=
c
.
length
>
1
?
c
.
substring
(
1
,
2
):
c
;
b
=
b
.
replace
(
"{"
+
d
+
"}"
,
'<select class="'
+
a
+
'"></select>'
)}),
b
},
initCombos
:
function
(){
for
(
var
a
in
this
.
map
){
var
b
=
this
.
$widget
.
find
(
"."
+
a
);
this
[
"$"
+
a
]
=
b
.
length
?
b
:
null
,
this
.
fillCombo
(
a
)}},
fillCombo
:
function
(
a
){
var
b
=
this
[
"$"
+
a
];
if
(
b
){
var
c
=
"fill"
+
a
.
charAt
(
0
).
toUpperCase
()
+
a
.
slice
(
1
),
d
=
this
[
c
](),
e
=
b
.
val
();
b
.
empty
();
for
(
var
f
=
0
;
f
<
d
.
length
;
f
++
)
b
.
append
(
'<option value="'
+
d
[
f
][
0
]
+
'">'
+
d
[
f
][
1
]
+
"</option>"
);
b
.
val
(
e
)}},
fillCommon
:
function
(
a
){
var
b
,
c
=
[];
if
(
"name"
===
this
.
options
.
firstItem
){
b
=
moment
.
relativeTime
||
moment
.
langData
().
_relativeTime
;
var
d
=
"function"
==
typeof
b
[
a
]?
b
[
a
](
1
,
!
0
,
a
,
!
1
):
b
[
a
];
d
=
d
.
split
(
" "
).
reverse
()[
0
],
c
.
push
([
""
,
d
])}
else
"empty"
===
this
.
options
.
firstItem
&&
c
.
push
([
""
,
""
]);
return
c
},
fillDay
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"d"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"DD"
),
e
=
31
;
if
(
this
.
options
.
smartDays
&&
this
.
$month
&&
this
.
$year
){
var
f
=
parseInt
(
this
.
$month
.
val
(),
10
),
g
=
parseInt
(
this
.
$year
.
val
(),
10
);
isNaN
(
f
)
||
isNaN
(
g
)
||
(
e
=
moment
([
g
,
f
]).
daysInMonth
())}
for
(
b
=
1
;
e
>=
b
;
b
++
)
a
=
d
?
this
.
leadZero
(
b
):
b
,
c
.
push
([
b
,
a
]);
return
c
},
fillMonth
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"M"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"MMMM"
),
e
=-
1
!==
this
.
options
.
template
.
indexOf
(
"MMM"
),
f
=-
1
!==
this
.
options
.
template
.
indexOf
(
"MM"
);
for
(
b
=
0
;
11
>=
b
;
b
++
)
a
=
d
?
moment
().
date
(
1
).
month
(
b
).
format
(
"MMMM"
):
e
?
moment
().
date
(
1
).
month
(
b
).
format
(
"MMM"
):
f
?
this
.
leadZero
(
b
+
1
):
b
+
1
,
c
.
push
([
b
,
a
]);
return
c
},
fillYear
:
function
(){
var
a
,
b
,
c
=
[],
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"YYYY"
);
for
(
b
=
this
.
options
.
maxYear
;
b
>=
this
.
options
.
minYear
;
b
--
)
a
=
d
?
b
:(
b
+
""
).
substring
(
2
),
c
[
this
.
options
.
yearDescending
?
"push"
:
"unshift"
]([
b
,
a
]);
return
c
=
this
.
fillCommon
(
"y"
).
concat
(
c
)},
fillHour
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"h"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"h"
),
e
=
(
-
1
!==
this
.
options
.
template
.
indexOf
(
"H"
),
-
1
!==
this
.
options
.
template
.
toLowerCase
().
indexOf
(
"hh"
)),
f
=
d
?
1
:
0
,
g
=
d
?
12
:
23
;
for
(
b
=
f
;
g
>=
b
;
b
++
)
a
=
e
?
this
.
leadZero
(
b
):
b
,
c
.
push
([
b
,
a
]);
return
c
},
fillMinute
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"m"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"mm"
);
for
(
b
=
0
;
59
>=
b
;
b
+=
this
.
options
.
minuteStep
)
a
=
d
?
this
.
leadZero
(
b
):
b
,
c
.
push
([
b
,
a
]);
return
c
},
fillSecond
:
function
(){
var
a
,
b
,
c
=
this
.
fillCommon
(
"s"
),
d
=-
1
!==
this
.
options
.
template
.
indexOf
(
"ss"
);
for
(
b
=
0
;
59
>=
b
;
b
+=
this
.
options
.
secondStep
)
a
=
d
?
this
.
leadZero
(
b
):
b
,
c
.
push
([
b
,
a
]);
return
c
},
fillAmpm
:
function
(){
var
a
=-
1
!==
this
.
options
.
template
.
indexOf
(
"a"
),
b
=
(
-
1
!==
this
.
options
.
template
.
indexOf
(
"A"
),[[
"am"
,
a
?
"am"
:
"AM"
],[
"pm"
,
a
?
"pm"
:
"PM"
]]);
return
b
},
getValue
:
function
(
b
){
var
c
,
d
=
{},
e
=
this
,
f
=!
1
;
return
a
.
each
(
this
.
map
,
function
(
a
){
if
(
"ampm"
!==
a
){
var
b
=
"day"
===
a
?
1
:
0
;
return
d
[
a
]
=
e
[
"$"
+
a
]?
parseInt
(
e
[
"$"
+
a
].
val
(),
10
):
b
,
isNaN
(
d
[
a
])?(
f
=!
0
,
!
1
):
void
0
}}),
f
?
""
:(
this
.
$ampm
&&
(
d
.
hour
=
12
===
d
.
hour
?
"am"
===
this
.
$ampm
.
val
()?
0
:
12
:
"am"
===
this
.
$ampm
.
val
()?
d
.
hour
:
d
.
hour
+
12
),
c
=
moment
([
d
.
year
,
d
.
month
,
d
.
day
,
d
.
hour
,
d
.
minute
,
d
.
second
]),
this
.
highlight
(
c
),
b
=
void
0
===
b
?
this
.
options
.
format
:
b
,
null
===
b
?
c
.
isValid
()?
c
:
null
:
c
.
isValid
()?
c
.
format
(
b
):
""
)},
setValue
:
function
(
b
){
function
c
(
b
,
c
){
var
d
=
{};
return
b
.
children
(
"option"
).
each
(
function
(
b
,
e
){
var
f
,
g
=
a
(
e
).
attr
(
"value"
);
""
!==
g
&&
(
f
=
Math
.
abs
(
g
-
c
),(
"undefined"
==
typeof
d
.
distance
||
f
<
d
.
distance
)
&&
(
d
=
{
value
:
g
,
distance
:
f
}))}),
d
.
value
}
if
(
b
){
var
d
=
"string"
==
typeof
b
?
moment
(
b
,
this
.
options
.
format
):
moment
(
b
),
e
=
this
,
f
=
{};
d
.
isValid
()
&&
(
a
.
each
(
this
.
map
,
function
(
a
,
b
){
"ampm"
!==
a
&&
(
f
[
a
]
=
d
[
b
[
1
]]())}),
this
.
$ampm
&&
(
f
.
hour
>=
12
?(
f
.
ampm
=
"pm"
,
f
.
hour
>
12
&&
(
f
.
hour
-=
12
)):(
f
.
ampm
=
"am"
,
0
===
f
.
hour
&&
(
f
.
hour
=
12
))),
a
.
each
(
f
,
function
(
a
,
b
){
e
[
"$"
+
a
]
&&
(
"minute"
===
a
&&
e
.
options
.
minuteStep
>
1
&&
e
.
options
.
roundTime
&&
(
b
=
c
(
e
[
"$"
+
a
],
b
)),
"second"
===
a
&&
e
.
options
.
secondStep
>
1
&&
e
.
options
.
roundTime
&&
(
b
=
c
(
e
[
"$"
+
a
],
b
)),
e
[
"$"
+
a
].
val
(
b
))}),
this
.
options
.
smartDays
&&
this
.
fillCombo
(
"day"
),
this
.
$element
.
val
(
d
.
format
(
this
.
options
.
format
)).
change
())}},
highlight
:
function
(
a
){
a
.
isValid
()?
this
.
options
.
errorClass
?
this
.
$widget
.
removeClass
(
this
.
options
.
errorClass
):
this
.
$widget
.
find
(
"select"
).
css
(
"border-color"
,
this
.
borderColor
):
this
.
options
.
errorClass
?
this
.
$widget
.
addClass
(
this
.
options
.
errorClass
):(
this
.
borderColor
||
(
this
.
borderColor
=
this
.
$widget
.
find
(
"select"
).
css
(
"border-color"
)),
this
.
$widget
.
find
(
"select"
).
css
(
"border-color"
,
"red"
))},
leadZero
:
function
(
a
){
return
9
>=
a
?
"0"
+
a
:
a
},
destroy
:
function
(){
this
.
$widget
.
remove
(),
this
.
$element
.
removeData
(
"combodate"
).
show
()}},
a
.
fn
.
combodate
=
function
(
c
){
var
d
,
e
=
Array
.
apply
(
null
,
arguments
);
return
e
.
shift
(),
"getValue"
===
c
&&
this
.
length
&&
(
d
=
this
.
eq
(
0
).
data
(
"combodate"
))?
d
.
getValue
.
apply
(
d
,
e
):
this
.
each
(
function
(){
var
d
=
a
(
this
),
f
=
d
.
data
(
"combodate"
),
g
=
"object"
==
typeof
c
&&
c
;
f
||
d
.
data
(
"combodate"
,
f
=
new
b
(
this
,
g
)),
"string"
==
typeof
c
&&
"function"
==
typeof
f
[
c
]
&&
f
[
c
].
apply
(
f
,
e
)})},
a
.
fn
.
combodate
.
defaults
=
{
format
:
"DD-MM-YYYY HH:mm"
,
template
:
"D / MMM / YYYY H : mm"
,
value
:
null
,
minYear
:
1970
,
maxYear
:
2015
,
yearDescending
:
!
0
,
minuteStep
:
5
,
secondStep
:
1
,
firstItem
:
"empty"
,
errorClass
:
null
,
roundTime
:
!
0
,
smartDays
:
!
1
}}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
c
){
this
.
init
(
"combodate"
,
c
,
b
.
defaults
),
this
.
options
.
viewformat
||
(
this
.
options
.
viewformat
=
this
.
options
.
format
),
c
.
combodate
=
a
.
fn
.
editableutils
.
tryParseJson
(
c
.
combodate
,
!
0
),
this
.
options
.
combodate
=
a
.
extend
({},
b
.
defaults
.
combodate
,
c
.
combodate
,{
format
:
this
.
options
.
format
,
template
:
this
.
options
.
template
})};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
$input
.
combodate
(
this
.
options
.
combodate
),
"bs3"
===
a
.
fn
.
editableform
.
engine
&&
this
.
$input
.
siblings
().
find
(
"select"
).
addClass
(
"form-control"
),
this
.
options
.
inputclass
&&
this
.
$input
.
siblings
().
find
(
"select"
).
addClass
(
this
.
options
.
inputclass
)},
value2html
:
function
(
a
,
c
){
var
d
=
a
?
a
.
format
(
this
.
options
.
viewformat
):
""
;
b
.
superclass
.
value2html
.
call
(
this
,
d
,
c
)},
html2value
:
function
(
a
){
return
a
?
moment
(
a
,
this
.
options
.
viewformat
):
null
},
value2str
:
function
(
a
){
return
a
?
a
.
format
(
this
.
options
.
format
):
""
},
str2value
:
function
(
a
){
return
a
?
moment
(
a
,
this
.
options
.
format
):
null
},
value2submit
:
function
(
a
){
return
this
.
value2str
(
a
)},
value2input
:
function
(
a
){
this
.
$input
.
combodate
(
"setValue"
,
a
)},
input2value
:
function
(){
return
this
.
$input
.
combodate
(
"getValue"
,
null
)},
activate
:
function
(){
this
.
$input
.
siblings
(
".combodate"
).
find
(
"select"
).
eq
(
0
).
focus
()},
autosubmit
:
function
(){}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<input type="text">'
,
inputclass
:
null
,
format
:
"YYYY-MM-DD"
,
viewformat
:
null
,
template
:
"D / MMM / YYYY"
,
combodate
:
null
}),
a
.
fn
.
editabletypes
.
combodate
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
a
.
fn
.
editableform
.
Constructor
.
prototype
.
initInput
;
a
.
extend
(
a
.
fn
.
editableform
.
Constructor
.
prototype
,{
initTemplate
:
function
(){
this
.
$form
=
a
(
a
.
fn
.
editableform
.
template
),
this
.
$form
.
find
(
".control-group"
).
addClass
(
"form-group"
),
this
.
$form
.
find
(
".editable-error-block"
).
addClass
(
"help-block"
)},
initInput
:
function
(){
b
.
apply
(
this
);
var
c
=
null
===
this
.
input
.
options
.
inputclass
||
this
.
input
.
options
.
inputclass
===!
1
,
d
=
"input-sm"
,
e
=
"text,select,textarea,password,email,url,tel,number,range,time,typeaheadjs"
.
split
(
","
);
~
a
.
inArray
(
this
.
input
.
type
,
e
)
&&
(
this
.
input
.
$input
.
addClass
(
"form-control"
),
c
&&
(
this
.
input
.
options
.
inputclass
=
d
,
this
.
input
.
$input
.
addClass
(
d
)));
for
(
var
f
=
this
.
$form
.
find
(
".editable-buttons"
),
g
=
c
?[
d
]:
this
.
input
.
options
.
inputclass
.
split
(
" "
),
h
=
0
;
h
<
g
.
length
;
h
++
)
"input-lg"
===
g
[
h
].
toLowerCase
()
&&
f
.
find
(
"button"
).
removeClass
(
"btn-sm"
).
addClass
(
"btn-lg"
)}}),
a
.
fn
.
editableform
.
buttons
=
'<button type="submit" class="btn btn-primary btn-sm editable-submit"><i class="glyphicon glyphicon-ok"></i></button><button type="button" class="btn btn-default btn-sm editable-cancel"><i class="glyphicon glyphicon-remove"></i></button>'
,
a
.
fn
.
editableform
.
errorGroupClass
=
"has-error"
,
a
.
fn
.
editableform
.
errorBlockClass
=
null
,
a
.
fn
.
editableform
.
engine
=
"bs3"
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
extend
(
a
.
fn
.
editableContainer
.
Popup
.
prototype
,{
containerName
:
"popover"
,
containerDataName
:
"bs.popover"
,
innerCss
:
".popover-content"
,
defaults
:
a
.
fn
.
popover
.
Constructor
.
DEFAULTS
,
initContainer
:
function
(){
a
.
extend
(
this
.
containerOptions
,{
trigger
:
"manual"
,
selector
:
!
1
,
content
:
" "
,
template
:
this
.
defaults
.
template
});
var
b
;
this
.
$element
.
data
(
"template"
)
&&
(
b
=
this
.
$element
.
data
(
"template"
),
this
.
$element
.
removeData
(
"template"
)),
this
.
call
(
this
.
containerOptions
),
b
&&
this
.
$element
.
data
(
"template"
,
b
)},
innerShow
:
function
(){
this
.
call
(
"show"
)},
innerHide
:
function
(){
this
.
call
(
"hide"
)},
innerDestroy
:
function
(){
this
.
call
(
"destroy"
)},
setContainerOption
:
function
(
a
,
b
){
this
.
container
().
options
[
a
]
=
b
},
setPosition
:
function
(){
!
function
(){
var
a
=
this
.
tip
(),
b
=
"function"
==
typeof
this
.
options
.
placement
?
this
.
options
.
placement
.
call
(
this
,
a
[
0
],
this
.
$element
[
0
]):
this
.
options
.
placement
,
c
=
/
\s?
auto
?\s?
/i
,
d
=
c
.
test
(
b
);
d
&&
(
b
=
b
.
replace
(
c
,
""
)
||
"top"
);
var
e
=
this
.
getPosition
(),
f
=
a
[
0
].
offsetWidth
,
g
=
a
[
0
].
offsetHeight
;
if
(
d
){
var
h
=
this
.
$element
.
parent
(),
i
=
b
,
j
=
document
.
documentElement
.
scrollTop
||
document
.
body
.
scrollTop
,
k
=
"body"
==
this
.
options
.
container
?
window
.
innerWidth
:
h
.
outerWidth
(),
l
=
"body"
==
this
.
options
.
container
?
window
.
innerHeight
:
h
.
outerHeight
(),
m
=
"body"
==
this
.
options
.
container
?
0
:
h
.
offset
().
left
;
b
=
"bottom"
==
b
&&
e
.
top
+
e
.
height
+
g
-
j
>
l
?
"top"
:
"top"
==
b
&&
e
.
top
-
j
-
g
<
0
?
"bottom"
:
"right"
==
b
&&
e
.
right
+
f
>
k
?
"left"
:
"left"
==
b
&&
e
.
left
-
f
<
m
?
"right"
:
b
,
a
.
removeClass
(
i
).
addClass
(
b
)}
var
n
=
this
.
getCalculatedOffset
(
b
,
e
,
f
,
g
);
this
.
applyPlacement
(
n
,
b
)}.
call
(
this
.
container
())}})}(
window
.
jQuery
),
function
(
a
){
function
b
(){
return
new
Date
(
Date
.
UTC
.
apply
(
Date
,
arguments
))}
function
c
(
b
,
c
){
var
d
,
e
=
a
(
b
).
data
(),
f
=
{},
g
=
new
RegExp
(
"^"
+
c
.
toLowerCase
()
+
"([A-Z])"
),
c
=
new
RegExp
(
"^"
+
c
.
toLowerCase
());
for
(
var
h
in
e
)
c
.
test
(
h
)
&&
(
d
=
h
.
replace
(
g
,
function
(
a
,
b
){
return
b
.
toLowerCase
()}),
f
[
d
]
=
e
[
h
]);
return
f
}
function
d
(
b
){
var
c
=
{};
if
(
k
[
b
]
||
(
b
=
b
.
split
(
"-"
)[
0
],
k
[
b
])){
var
d
=
k
[
b
];
return
a
.
each
(
j
,
function
(
a
,
b
){
b
in
d
&&
(
c
[
b
]
=
d
[
b
])}),
c
}}
var
e
=
function
(
b
,
c
){
this
.
_process_options
(
c
),
this
.
element
=
a
(
b
),
this
.
isInline
=!
1
,
this
.
isInput
=
this
.
element
.
is
(
"input"
),
this
.
component
=
this
.
element
.
is
(
".date"
)?
this
.
element
.
find
(
".add-on, .btn"
):
!
1
,
this
.
hasInput
=
this
.
component
&&
this
.
element
.
find
(
"input"
).
length
,
this
.
component
&&
0
===
this
.
component
.
length
&&
(
this
.
component
=!
1
),
this
.
picker
=
a
(
l
.
template
),
this
.
_buildEvents
(),
this
.
_attachEvents
(),
this
.
isInline
?
this
.
picker
.
addClass
(
"datepicker-inline"
).
appendTo
(
this
.
element
):
this
.
picker
.
addClass
(
"datepicker-dropdown dropdown-menu"
),
this
.
o
.
rtl
&&
(
this
.
picker
.
addClass
(
"datepicker-rtl"
),
this
.
picker
.
find
(
".prev i, .next i"
).
toggleClass
(
"icon-arrow-left icon-arrow-right"
)),
this
.
viewMode
=
this
.
o
.
startView
,
this
.
o
.
calendarWeeks
&&
this
.
picker
.
find
(
"tfoot th.today"
).
attr
(
"colspan"
,
function
(
a
,
b
){
return
parseInt
(
b
)
+
1
}),
this
.
_allow_update
=!
1
,
this
.
setStartDate
(
this
.
o
.
startDate
),
this
.
setEndDate
(
this
.
o
.
endDate
),
this
.
setDaysOfWeekDisabled
(
this
.
o
.
daysOfWeekDisabled
),
this
.
fillDow
(),
this
.
fillMonths
(),
this
.
_allow_update
=!
0
,
this
.
update
(),
this
.
showMode
(),
this
.
isInline
&&
this
.
show
()};
e
.
prototype
=
{
constructor
:
e
,
_process_options
:
function
(
b
){
this
.
_o
=
a
.
extend
({},
this
.
_o
,
b
);
var
c
=
this
.
o
=
a
.
extend
({},
this
.
_o
),
d
=
c
.
language
;
switch
(
k
[
d
]
||
(
d
=
d
.
split
(
"-"
)[
0
],
k
[
d
]
||
(
d
=
i
.
language
)),
c
.
language
=
d
,
c
.
startView
){
case
2
:
case
"decade"
:
c
.
startView
=
2
;
break
;
case
1
:
case
"year"
:
c
.
startView
=
1
;
break
;
default
:
c
.
startView
=
0
}
switch
(
c
.
minViewMode
){
case
1
:
case
"months"
:
c
.
minViewMode
=
1
;
break
;
case
2
:
case
"years"
:
c
.
minViewMode
=
2
;
break
;
default
:
c
.
minViewMode
=
0
}
c
.
startView
=
Math
.
max
(
c
.
startView
,
c
.
minViewMode
),
c
.
weekStart
%=
7
,
c
.
weekEnd
=
(
c
.
weekStart
+
6
)
%
7
;
var
e
=
l
.
parseFormat
(
c
.
format
);
c
.
startDate
!==-
1
/
0
&&
(
c
.
startDate
=
l
.
parseDate
(
c
.
startDate
,
e
,
c
.
language
)),
1
/
0
!==
c
.
endDate
&&
(
c
.
endDate
=
l
.
parseDate
(
c
.
endDate
,
e
,
c
.
language
)),
c
.
daysOfWeekDisabled
=
c
.
daysOfWeekDisabled
||
[],
a
.
isArray
(
c
.
daysOfWeekDisabled
)
||
(
c
.
daysOfWeekDisabled
=
c
.
daysOfWeekDisabled
.
split
(
/
[
,
\s]
*/
)),
c
.
daysOfWeekDisabled
=
a
.
map
(
c
.
daysOfWeekDisabled
,
function
(
a
){
return
parseInt
(
a
,
10
)})},
_events
:[],
_secondaryEvents
:[],
_applyEvents
:
function
(
a
){
for
(
var
b
,
c
,
d
=
0
;
d
<
a
.
length
;
d
++
)
b
=
a
[
d
][
0
],
c
=
a
[
d
][
1
],
b
.
on
(
c
)},
_unapplyEvents
:
function
(
a
){
for
(
var
b
,
c
,
d
=
0
;
d
<
a
.
length
;
d
++
)
b
=
a
[
d
][
0
],
c
=
a
[
d
][
1
],
b
.
off
(
c
)},
_buildEvents
:
function
(){
this
.
isInput
?
this
.
_events
=
[[
this
.
element
,{
focus
:
a
.
proxy
(
this
.
show
,
this
),
keyup
:
a
.
proxy
(
this
.
update
,
this
),
keydown
:
a
.
proxy
(
this
.
keydown
,
this
)}]]:
this
.
component
&&
this
.
hasInput
?
this
.
_events
=
[[
this
.
element
.
find
(
"input"
),{
focus
:
a
.
proxy
(
this
.
show
,
this
),
keyup
:
a
.
proxy
(
this
.
update
,
this
),
keydown
:
a
.
proxy
(
this
.
keydown
,
this
)}],[
this
.
component
,{
click
:
a
.
proxy
(
this
.
show
,
this
)}]]:
this
.
element
.
is
(
"div"
)?
this
.
isInline
=!
0
:
this
.
_events
=
[[
this
.
element
,{
click
:
a
.
proxy
(
this
.
show
,
this
)}]],
this
.
_secondaryEvents
=
[[
this
.
picker
,{
click
:
a
.
proxy
(
this
.
click
,
this
)}],[
a
(
window
),{
resize
:
a
.
proxy
(
this
.
place
,
this
)}],[
a
(
document
),{
mousedown
:
a
.
proxy
(
function
(
a
){
this
.
element
.
is
(
a
.
target
)
||
this
.
element
.
find
(
a
.
target
).
size
()
||
this
.
picker
.
is
(
a
.
target
)
||
this
.
picker
.
find
(
a
.
target
).
size
()
||
this
.
hide
()},
this
)}]]},
_attachEvents
:
function
(){
this
.
_detachEvents
(),
this
.
_applyEvents
(
this
.
_events
)},
_detachEvents
:
function
(){
this
.
_unapplyEvents
(
this
.
_events
)},
_attachSecondaryEvents
:
function
(){
this
.
_detachSecondaryEvents
(),
this
.
_applyEvents
(
this
.
_secondaryEvents
)},
_detachSecondaryEvents
:
function
(){
this
.
_unapplyEvents
(
this
.
_secondaryEvents
)},
_trigger
:
function
(
b
,
c
){
var
d
=
c
||
this
.
date
,
e
=
new
Date
(
d
.
getTime
()
+
6
e4
*
d
.
getTimezoneOffset
());
this
.
element
.
trigger
({
type
:
b
,
date
:
e
,
format
:
a
.
proxy
(
function
(
a
){
var
b
=
a
||
this
.
o
.
format
;
return
l
.
formatDate
(
d
,
b
,
this
.
o
.
language
)},
this
)})},
show
:
function
(
a
){
this
.
isInline
||
this
.
picker
.
appendTo
(
"body"
),
this
.
picker
.
show
(),
this
.
height
=
this
.
component
?
this
.
component
.
outerHeight
():
this
.
element
.
outerHeight
(),
this
.
place
(),
this
.
_attachSecondaryEvents
(),
a
&&
a
.
preventDefault
(),
this
.
_trigger
(
"show"
)},
hide
:
function
(){
this
.
isInline
||
this
.
picker
.
is
(
":visible"
)
&&
(
this
.
picker
.
hide
().
detach
(),
this
.
_detachSecondaryEvents
(),
this
.
viewMode
=
this
.
o
.
startView
,
this
.
showMode
(),
this
.
o
.
forceParse
&&
(
this
.
isInput
&&
this
.
element
.
val
()
||
this
.
hasInput
&&
this
.
element
.
find
(
"input"
).
val
())
&&
this
.
setValue
(),
this
.
_trigger
(
"hide"
))},
remove
:
function
(){
this
.
hide
(),
this
.
_detachEvents
(),
this
.
_detachSecondaryEvents
(),
this
.
picker
.
remove
(),
delete
this
.
element
.
data
().
datepicker
,
this
.
isInput
||
delete
this
.
element
.
data
().
date
},
getDate
:
function
(){
var
a
=
this
.
getUTCDate
();
return
new
Date
(
a
.
getTime
()
+
6
e4
*
a
.
getTimezoneOffset
())},
getUTCDate
:
function
(){
return
this
.
date
},
setDate
:
function
(
a
){
this
.
setUTCDate
(
new
Date
(
a
.
getTime
()
-
6
e4
*
a
.
getTimezoneOffset
()))},
setUTCDate
:
function
(
a
){
this
.
date
=
a
,
this
.
setValue
()},
setValue
:
function
(){
var
a
=
this
.
getFormattedDate
();
this
.
isInput
?
this
.
element
.
val
(
a
):
this
.
component
&&
this
.
element
.
find
(
"input"
).
val
(
a
)},
getFormattedDate
:
function
(
a
){
return
void
0
===
a
&&
(
a
=
this
.
o
.
format
),
l
.
formatDate
(
this
.
date
,
a
,
this
.
o
.
language
)},
setStartDate
:
function
(
a
){
this
.
_process_options
({
startDate
:
a
}),
this
.
update
(),
this
.
updateNavArrows
()},
setEndDate
:
function
(
a
){
this
.
_process_options
({
endDate
:
a
}),
this
.
update
(),
this
.
updateNavArrows
()},
setDaysOfWeekDisabled
:
function
(
a
){
this
.
_process_options
({
daysOfWeekDisabled
:
a
}),
this
.
update
(),
this
.
updateNavArrows
()},
place
:
function
(){
if
(
!
this
.
isInline
){
var
b
=
parseInt
(
this
.
element
.
parents
().
filter
(
function
(){
return
"auto"
!=
a
(
this
).
css
(
"z-index"
)}).
first
().
css
(
"z-index"
))
+
10
,
c
=
this
.
component
?
this
.
component
.
parent
().
offset
():
this
.
element
.
offset
(),
d
=
this
.
component
?
this
.
component
.
outerHeight
(
!
0
):
this
.
element
.
outerHeight
(
!
0
);
this
.
picker
.
css
({
top
:
c
.
top
+
d
,
left
:
c
.
left
,
zIndex
:
b
})}},
_allow_update
:
!
0
,
update
:
function
(){
if
(
this
.
_allow_update
){
var
a
,
b
=!
1
;
arguments
&&
arguments
.
length
&&
(
"string"
==
typeof
arguments
[
0
]
||
arguments
[
0
]
instanceof
Date
)?(
a
=
arguments
[
0
],
b
=!
0
):(
a
=
this
.
isInput
?
this
.
element
.
val
():
this
.
element
.
data
(
"date"
)
||
this
.
element
.
find
(
"input"
).
val
(),
delete
this
.
element
.
data
().
date
),
this
.
date
=
l
.
parseDate
(
a
,
this
.
o
.
format
,
this
.
o
.
language
),
b
&&
this
.
setValue
(),
this
.
viewDate
=
this
.
date
<
this
.
o
.
startDate
?
new
Date
(
this
.
o
.
startDate
):
this
.
date
>
this
.
o
.
endDate
?
new
Date
(
this
.
o
.
endDate
):
new
Date
(
this
.
date
),
this
.
fill
()}},
fillDow
:
function
(){
var
a
=
this
.
o
.
weekStart
,
b
=
"<tr>"
;
if
(
this
.
o
.
calendarWeeks
){
var
c
=
'<th class="cw"> </th>'
;
b
+=
c
,
this
.
picker
.
find
(
".datepicker-days thead tr:first-child"
).
prepend
(
c
)}
for
(;
a
<
this
.
o
.
weekStart
+
7
;)
b
+=
'<th class="dow">'
+
k
[
this
.
o
.
language
].
daysMin
[
a
++%
7
]
+
"</th>"
;
b
+=
"</tr>"
,
this
.
picker
.
find
(
".datepicker-days thead"
).
append
(
b
)},
fillMonths
:
function
(){
for
(
var
a
=
""
,
b
=
0
;
12
>
b
;)
a
+=
'<span class="month">'
+
k
[
this
.
o
.
language
].
monthsShort
[
b
++
]
+
"</span>"
;
this
.
picker
.
find
(
".datepicker-months td"
).
html
(
a
)},
setRange
:
function
(
b
){
b
&&
b
.
length
?
this
.
range
=
a
.
map
(
b
,
function
(
a
){
return
a
.
valueOf
()}):
delete
this
.
range
,
this
.
fill
()},
getClassNames
:
function
(
b
){
var
c
=
[],
d
=
this
.
viewDate
.
getUTCFullYear
(),
e
=
this
.
viewDate
.
getUTCMonth
(),
f
=
this
.
date
.
valueOf
(),
g
=
new
Date
;
return
b
.
getUTCFullYear
()
<
d
||
b
.
getUTCFullYear
()
==
d
&&
b
.
getUTCMonth
()
<
e
?
c
.
push
(
"old"
):(
b
.
getUTCFullYear
()
>
d
||
b
.
getUTCFullYear
()
==
d
&&
b
.
getUTCMonth
()
>
e
)
&&
c
.
push
(
"new"
),
this
.
o
.
todayHighlight
&&
b
.
getUTCFullYear
()
==
g
.
getFullYear
()
&&
b
.
getUTCMonth
()
==
g
.
getMonth
()
&&
b
.
getUTCDate
()
==
g
.
getDate
()
&&
c
.
push
(
"today"
),
f
&&
b
.
valueOf
()
==
f
&&
c
.
push
(
"active"
),(
b
.
valueOf
()
<
this
.
o
.
startDate
||
b
.
valueOf
()
>
this
.
o
.
endDate
||-
1
!==
a
.
inArray
(
b
.
getUTCDay
(),
this
.
o
.
daysOfWeekDisabled
))
&&
c
.
push
(
"disabled"
),
this
.
range
&&
(
b
>
this
.
range
[
0
]
&&
b
<
this
.
range
[
this
.
range
.
length
-
1
]
&&
c
.
push
(
"range"
),
-
1
!=
a
.
inArray
(
b
.
valueOf
(),
this
.
range
)
&&
c
.
push
(
"selected"
)),
c
},
fill
:
function
(){
var
c
,
d
=
new
Date
(
this
.
viewDate
),
e
=
d
.
getUTCFullYear
(),
f
=
d
.
getUTCMonth
(),
g
=
this
.
o
.
startDate
!==-
1
/
0
?
this
.
o
.
startDate
.
getUTCFullYear
():
-
1
/
0
,
h
=
this
.
o
.
startDate
!==-
1
/
0
?
this
.
o
.
startDate
.
getUTCMonth
():
-
1
/
0
,
i
=
1
/
0
!==
this
.
o
.
endDate
?
this
.
o
.
endDate
.
getUTCFullYear
():
1
/
0
,
j
=
1
/
0
!==
this
.
o
.
endDate
?
this
.
o
.
endDate
.
getUTCMonth
():
1
/
0
;
this
.
date
&&
this
.
date
.
valueOf
(),
this
.
picker
.
find
(
".datepicker-days thead th.datepicker-switch"
).
text
(
k
[
this
.
o
.
language
].
months
[
f
]
+
" "
+
e
),
this
.
picker
.
find
(
"tfoot th.today"
).
text
(
k
[
this
.
o
.
language
].
today
).
toggle
(
this
.
o
.
todayBtn
!==!
1
),
this
.
picker
.
find
(
"tfoot th.clear"
).
text
(
k
[
this
.
o
.
language
].
clear
).
toggle
(
this
.
o
.
clearBtn
!==!
1
),
this
.
updateNavArrows
(),
this
.
fillMonths
();
var
m
=
b
(
e
,
f
-
1
,
28
,
0
,
0
,
0
,
0
),
n
=
l
.
getDaysInMonth
(
m
.
getUTCFullYear
(),
m
.
getUTCMonth
());
m
.
setUTCDate
(
n
),
m
.
setUTCDate
(
n
-
(
m
.
getUTCDay
()
-
this
.
o
.
weekStart
+
7
)
%
7
);
var
o
=
new
Date
(
m
);
o
.
setUTCDate
(
o
.
getUTCDate
()
+
42
),
o
=
o
.
valueOf
();
for
(
var
p
,
q
=
[];
m
.
valueOf
()
<
o
;){
if
(
m
.
getUTCDay
()
==
this
.
o
.
weekStart
&&
(
q
.
push
(
"<tr>"
),
this
.
o
.
calendarWeeks
)){
var
r
=
new
Date
(
+
m
+
864
e5
*
((
this
.
o
.
weekStart
-
m
.
getUTCDay
()
-
7
)
%
7
)),
s
=
new
Date
(
+
r
+
864
e5
*
((
11
-
r
.
getUTCDay
())
%
7
)),
t
=
new
Date
(
+
(
t
=
b
(
s
.
getUTCFullYear
(),
0
,
1
))
+
864
e5
*
((
11
-
t
.
getUTCDay
())
%
7
)),
u
=
(
s
-
t
)
/
864
e5
/
7
+
1
;
q
.
push
(
'<td class="cw">'
+
u
+
"</td>"
)}
p
=
this
.
getClassNames
(
m
),
p
.
push
(
"day"
);
var
v
=
this
.
o
.
beforeShowDay
(
m
);
void
0
===
v
?
v
=
{}:
"boolean"
==
typeof
v
?
v
=
{
enabled
:
v
}:
"string"
==
typeof
v
&&
(
v
=
{
classes
:
v
}),
v
.
enabled
===!
1
&&
p
.
push
(
"disabled"
),
v
.
classes
&&
(
p
=
p
.
concat
(
v
.
classes
.
split
(
/
\s
+/
))),
v
.
tooltip
&&
(
c
=
v
.
tooltip
),
p
=
a
.
unique
(
p
),
q
.
push
(
'<td class="'
+
p
.
join
(
" "
)
+
'"'
+
(
c
?
' title="'
+
c
+
'"'
:
""
)
+
">"
+
m
.
getUTCDate
()
+
"</td>"
),
m
.
getUTCDay
()
==
this
.
o
.
weekEnd
&&
q
.
push
(
"</tr>"
),
m
.
setUTCDate
(
m
.
getUTCDate
()
+
1
)}
this
.
picker
.
find
(
".datepicker-days tbody"
).
empty
().
append
(
q
.
join
(
""
));
var
w
=
this
.
date
&&
this
.
date
.
getUTCFullYear
(),
x
=
this
.
picker
.
find
(
".datepicker-months"
).
find
(
"th:eq(1)"
).
text
(
e
).
end
().
find
(
"span"
).
removeClass
(
"active"
);
w
&&
w
==
e
&&
x
.
eq
(
this
.
date
.
getUTCMonth
()).
addClass
(
"active"
),(
g
>
e
||
e
>
i
)
&&
x
.
addClass
(
"disabled"
),
e
==
g
&&
x
.
slice
(
0
,
h
).
addClass
(
"disabled"
),
e
==
i
&&
x
.
slice
(
j
+
1
).
addClass
(
"disabled"
),
q
=
""
,
e
=
10
*
parseInt
(
e
/
10
,
10
);
var
y
=
this
.
picker
.
find
(
".datepicker-years"
).
find
(
"th:eq(1)"
).
text
(
e
+
"-"
+
(
e
+
9
)).
end
().
find
(
"td"
);
e
-=
1
;
for
(
var
z
=-
1
;
11
>
z
;
z
++
)
q
+=
'<span class="year'
+
(
-
1
==
z
?
" old"
:
10
==
z
?
" new"
:
""
)
+
(
w
==
e
?
" active"
:
""
)
+
(
g
>
e
||
e
>
i
?
" disabled"
:
""
)
+
'">'
+
e
+
"</span>"
,
e
+=
1
;
y
.
html
(
q
)},
updateNavArrows
:
function
(){
if
(
this
.
_allow_update
){
var
a
=
new
Date
(
this
.
viewDate
),
b
=
a
.
getUTCFullYear
(),
c
=
a
.
getUTCMonth
();
switch
(
this
.
viewMode
){
case
0
:
this
.
o
.
startDate
!==-
1
/
0
&&
b
<=
this
.
o
.
startDate
.
getUTCFullYear
()
&&
c
<=
this
.
o
.
startDate
.
getUTCMonth
()?
this
.
picker
.
find
(
".prev"
).
css
({
visibility
:
"hidden"
}):
this
.
picker
.
find
(
".prev"
).
css
({
visibility
:
"visible"
}),
1
/
0
!==
this
.
o
.
endDate
&&
b
>=
this
.
o
.
endDate
.
getUTCFullYear
()
&&
c
>=
this
.
o
.
endDate
.
getUTCMonth
()?
this
.
picker
.
find
(
".next"
).
css
({
visibility
:
"hidden"
}):
this
.
picker
.
find
(
".next"
).
css
({
visibility
:
"visible"
});
break
;
case
1
:
case
2
:
this
.
o
.
startDate
!==-
1
/
0
&&
b
<=
this
.
o
.
startDate
.
getUTCFullYear
()?
this
.
picker
.
find
(
".prev"
).
css
({
visibility
:
"hidden"
}):
this
.
picker
.
find
(
".prev"
).
css
({
visibility
:
"visible"
}),
1
/
0
!==
this
.
o
.
endDate
&&
b
>=
this
.
o
.
endDate
.
getUTCFullYear
()?
this
.
picker
.
find
(
".next"
).
css
({
visibility
:
"hidden"
}):
this
.
picker
.
find
(
".next"
).
css
({
visibility
:
"visible"
})}}},
click
:
function
(
c
){
c
.
preventDefault
();
var
d
=
a
(
c
.
target
).
closest
(
"span, td, th"
);
if
(
1
==
d
.
length
)
switch
(
d
[
0
].
nodeName
.
toLowerCase
()){
case
"th"
:
switch
(
d
[
0
].
className
){
case
"datepicker-switch"
:
this
.
showMode
(
1
);
break
;
case
"prev"
:
case
"next"
:
var
e
=
l
.
modes
[
this
.
viewMode
].
navStep
*
(
"prev"
==
d
[
0
].
className
?
-
1
:
1
);
switch
(
this
.
viewMode
){
case
0
:
this
.
viewDate
=
this
.
moveMonth
(
this
.
viewDate
,
e
);
break
;
case
1
:
case
2
:
this
.
viewDate
=
this
.
moveYear
(
this
.
viewDate
,
e
)}
this
.
fill
();
break
;
case
"today"
:
var
f
=
new
Date
;
f
=
b
(
f
.
getFullYear
(),
f
.
getMonth
(),
f
.
getDate
(),
0
,
0
,
0
),
this
.
showMode
(
-
2
);
var
g
=
"linked"
==
this
.
o
.
todayBtn
?
null
:
"view"
;
this
.
_setDate
(
f
,
g
);
break
;
case
"clear"
:
var
h
;
this
.
isInput
?
h
=
this
.
element
:
this
.
component
&&
(
h
=
this
.
element
.
find
(
"input"
)),
h
&&
h
.
val
(
""
).
change
(),
this
.
_trigger
(
"changeDate"
),
this
.
update
(),
this
.
o
.
autoclose
&&
this
.
hide
()}
break
;
case
"span"
:
if
(
!
d
.
is
(
".disabled"
)){
if
(
this
.
viewDate
.
setUTCDate
(
1
),
d
.
is
(
".month"
)){
var
i
=
1
,
j
=
d
.
parent
().
find
(
"span"
).
index
(
d
),
k
=
this
.
viewDate
.
getUTCFullYear
();
this
.
viewDate
.
setUTCMonth
(
j
),
this
.
_trigger
(
"changeMonth"
,
this
.
viewDate
),
1
===
this
.
o
.
minViewMode
&&
this
.
_setDate
(
b
(
k
,
j
,
i
,
0
,
0
,
0
,
0
))}
else
{
var
k
=
parseInt
(
d
.
text
(),
10
)
||
0
,
i
=
1
,
j
=
0
;
this
.
viewDate
.
setUTCFullYear
(
k
),
this
.
_trigger
(
"changeYear"
,
this
.
viewDate
),
2
===
this
.
o
.
minViewMode
&&
this
.
_setDate
(
b
(
k
,
j
,
i
,
0
,
0
,
0
,
0
))}
this
.
showMode
(
-
1
),
this
.
fill
()}
break
;
case
"td"
:
if
(
d
.
is
(
".day"
)
&&!
d
.
is
(
".disabled"
)){
var
i
=
parseInt
(
d
.
text
(),
10
)
||
1
,
k
=
this
.
viewDate
.
getUTCFullYear
(),
j
=
this
.
viewDate
.
getUTCMonth
();
d
.
is
(
".old"
)?
0
===
j
?(
j
=
11
,
k
-=
1
):
j
-=
1
:
d
.
is
(
".new"
)
&&
(
11
==
j
?(
j
=
0
,
k
+=
1
):
j
+=
1
),
this
.
_setDate
(
b
(
k
,
j
,
i
,
0
,
0
,
0
,
0
))}}},
_setDate
:
function
(
a
,
b
){
b
&&
"date"
!=
b
||
(
this
.
date
=
new
Date
(
a
)),
b
&&
"view"
!=
b
||
(
this
.
viewDate
=
new
Date
(
a
)),
this
.
fill
(),
this
.
setValue
(),
this
.
_trigger
(
"changeDate"
);
var
c
;
this
.
isInput
?
c
=
this
.
element
:
this
.
component
&&
(
c
=
this
.
element
.
find
(
"input"
)),
c
&&
(
c
.
change
(),
!
this
.
o
.
autoclose
||
b
&&
"date"
!=
b
||
this
.
hide
())},
moveMonth
:
function
(
a
,
b
){
if
(
!
b
)
return
a
;
var
c
,
d
,
e
=
new
Date
(
a
.
valueOf
()),
f
=
e
.
getUTCDate
(),
g
=
e
.
getUTCMonth
(),
h
=
Math
.
abs
(
b
);
if
(
b
=
b
>
0
?
1
:
-
1
,
1
==
h
)
d
=-
1
==
b
?
function
(){
return
e
.
getUTCMonth
()
==
g
}:
function
(){
return
e
.
getUTCMonth
()
!=
c
},
c
=
g
+
b
,
e
.
setUTCMonth
(
c
),(
0
>
c
||
c
>
11
)
&&
(
c
=
(
c
+
12
)
%
12
);
else
{
for
(
var
i
=
0
;
h
>
i
;
i
++
)
e
=
this
.
moveMonth
(
e
,
b
);
c
=
e
.
getUTCMonth
(),
e
.
setUTCDate
(
f
),
d
=
function
(){
return
c
!=
e
.
getUTCMonth
()}}
for
(;
d
();)
e
.
setUTCDate
(
--
f
),
e
.
setUTCMonth
(
c
);
return
e
},
moveYear
:
function
(
a
,
b
){
return
this
.
moveMonth
(
a
,
12
*
b
)},
dateWithinRange
:
function
(
a
){
return
a
>=
this
.
o
.
startDate
&&
a
<=
this
.
o
.
endDate
},
keydown
:
function
(
a
){
if
(
this
.
picker
.
is
(
":not(:visible)"
))
return
27
==
a
.
keyCode
&&
this
.
show
(),
void
0
;
var
b
,
c
,
d
,
e
=!
1
;
switch
(
a
.
keyCode
){
case
27
:
this
.
hide
(),
a
.
preventDefault
();
break
;
case
37
:
case
39
:
if
(
!
this
.
o
.
keyboardNavigation
)
break
;
b
=
37
==
a
.
keyCode
?
-
1
:
1
,
a
.
ctrlKey
?(
c
=
this
.
moveYear
(
this
.
date
,
b
),
d
=
this
.
moveYear
(
this
.
viewDate
,
b
)):
a
.
shiftKey
?(
c
=
this
.
moveMonth
(
this
.
date
,
b
),
d
=
this
.
moveMonth
(
this
.
viewDate
,
b
)):(
c
=
new
Date
(
this
.
date
),
c
.
setUTCDate
(
this
.
date
.
getUTCDate
()
+
b
),
d
=
new
Date
(
this
.
viewDate
),
d
.
setUTCDate
(
this
.
viewDate
.
getUTCDate
()
+
b
)),
this
.
dateWithinRange
(
c
)
&&
(
this
.
date
=
c
,
this
.
viewDate
=
d
,
this
.
setValue
(),
this
.
update
(),
a
.
preventDefault
(),
e
=!
0
);
break
;
case
38
:
case
40
:
if
(
!
this
.
o
.
keyboardNavigation
)
break
;
b
=
38
==
a
.
keyCode
?
-
1
:
1
,
a
.
ctrlKey
?(
c
=
this
.
moveYear
(
this
.
date
,
b
),
d
=
this
.
moveYear
(
this
.
viewDate
,
b
)):
a
.
shiftKey
?(
c
=
this
.
moveMonth
(
this
.
date
,
b
),
d
=
this
.
moveMonth
(
this
.
viewDate
,
b
)):(
c
=
new
Date
(
this
.
date
),
c
.
setUTCDate
(
this
.
date
.
getUTCDate
()
+
7
*
b
),
d
=
new
Date
(
this
.
viewDate
),
d
.
setUTCDate
(
this
.
viewDate
.
getUTCDate
()
+
7
*
b
)),
this
.
dateWithinRange
(
c
)
&&
(
this
.
date
=
c
,
this
.
viewDate
=
d
,
this
.
setValue
(),
this
.
update
(),
a
.
preventDefault
(),
e
=!
0
);
break
;
case
13
:
this
.
hide
(),
a
.
preventDefault
();
break
;
case
9
:
this
.
hide
()}
if
(
e
){
this
.
_trigger
(
"changeDate"
);
var
f
;
this
.
isInput
?
f
=
this
.
element
:
this
.
component
&&
(
f
=
this
.
element
.
find
(
"input"
)),
f
&&
f
.
change
()}},
showMode
:
function
(
a
){
a
&&
(
this
.
viewMode
=
Math
.
max
(
this
.
o
.
minViewMode
,
Math
.
min
(
2
,
this
.
viewMode
+
a
))),
this
.
picker
.
find
(
">div"
).
hide
().
filter
(
".datepicker-"
+
l
.
modes
[
this
.
viewMode
].
clsName
).
css
(
"display"
,
"block"
),
this
.
updateNavArrows
()}};
var
f
=
function
(
b
,
c
){
this
.
element
=
a
(
b
),
this
.
inputs
=
a
.
map
(
c
.
inputs
,
function
(
a
){
return
a
.
jquery
?
a
[
0
]:
a
}),
delete
c
.
inputs
,
a
(
this
.
inputs
).
datepicker
(
c
).
bind
(
"changeDate"
,
a
.
proxy
(
this
.
dateUpdated
,
this
)),
this
.
pickers
=
a
.
map
(
this
.
inputs
,
function
(
b
){
return
a
(
b
).
data
(
"datepicker"
)}),
this
.
updateDates
()};
f
.
prototype
=
{
updateDates
:
function
(){
this
.
dates
=
a
.
map
(
this
.
pickers
,
function
(
a
){
return
a
.
date
}),
this
.
updateRanges
()},
updateRanges
:
function
(){
var
b
=
a
.
map
(
this
.
dates
,
function
(
a
){
return
a
.
valueOf
()});
a
.
each
(
this
.
pickers
,
function
(
a
,
c
){
c
.
setRange
(
b
)})},
dateUpdated
:
function
(
b
){
var
c
=
a
(
b
.
target
).
data
(
"datepicker"
),
d
=
c
.
getUTCDate
(),
e
=
a
.
inArray
(
b
.
target
,
this
.
inputs
),
f
=
this
.
inputs
.
length
;
if
(
-
1
!=
e
){
if
(
d
<
this
.
dates
[
e
])
for
(;
e
>=
0
&&
d
<
this
.
dates
[
e
];)
this
.
pickers
[
e
--
].
setUTCDate
(
d
);
else
if
(
d
>
this
.
dates
[
e
])
for
(;
f
>
e
&&
d
>
this
.
dates
[
e
];)
this
.
pickers
[
e
++
].
setUTCDate
(
d
);
this
.
updateDates
()}},
remove
:
function
(){
a
.
map
(
this
.
pickers
,
function
(
a
){
a
.
remove
()}),
delete
this
.
element
.
data
().
datepicker
}};
var
g
=
a
.
fn
.
datepicker
,
h
=
a
.
fn
.
datepicker
=
function
(
b
){
var
g
=
Array
.
apply
(
null
,
arguments
);
g
.
shift
();
var
h
;
return
this
.
each
(
function
(){
var
j
=
a
(
this
),
k
=
j
.
data
(
"datepicker"
),
l
=
"object"
==
typeof
b
&&
b
;
if
(
!
k
){
var
m
=
c
(
this
,
"date"
),
n
=
a
.
extend
({},
i
,
m
,
l
),
o
=
d
(
n
.
language
),
p
=
a
.
extend
({},
i
,
o
,
m
,
l
);
if
(
j
.
is
(
".input-daterange"
)
||
p
.
inputs
){
var
q
=
{
inputs
:
p
.
inputs
||
j
.
find
(
"input"
).
toArray
()};
j
.
data
(
"datepicker"
,
k
=
new
f
(
this
,
a
.
extend
(
p
,
q
)))}
else
j
.
data
(
"datepicker"
,
k
=
new
e
(
this
,
p
))}
return
"string"
==
typeof
b
&&
"function"
==
typeof
k
[
b
]
&&
(
h
=
k
[
b
].
apply
(
k
,
g
),
void
0
!==
h
)?
!
1
:
void
0
}),
void
0
!==
h
?
h
:
this
},
i
=
a
.
fn
.
datepicker
.
defaults
=
{
autoclose
:
!
1
,
beforeShowDay
:
a
.
noop
,
calendarWeeks
:
!
1
,
clearBtn
:
!
1
,
daysOfWeekDisabled
:[],
endDate
:
1
/
0
,
forceParse
:
!
0
,
format
:
"mm/dd/yyyy"
,
keyboardNavigation
:
!
0
,
language
:
"en"
,
minViewMode
:
0
,
rtl
:
!
1
,
startDate
:
-
1
/
0
,
startView
:
0
,
todayBtn
:
!
1
,
todayHighlight
:
!
1
,
weekStart
:
0
},
j
=
a
.
fn
.
datepicker
.
locale_opts
=
[
"format"
,
"rtl"
,
"weekStart"
];
a
.
fn
.
datepicker
.
Constructor
=
e
;
var
k
=
a
.
fn
.
datepicker
.
dates
=
{
en
:{
days
:[
"Sunday"
,
"Monday"
,
"Tuesday"
,
"Wednesday"
,
"Thursday"
,
"Friday"
,
"Saturday"
,
"Sunday"
],
daysShort
:[
"Sun"
,
"Mon"
,
"Tue"
,
"Wed"
,
"Thu"
,
"Fri"
,
"Sat"
,
"Sun"
],
daysMin
:[
"Su"
,
"Mo"
,
"Tu"
,
"We"
,
"Th"
,
"Fr"
,
"Sa"
,
"Su"
],
months
:[
"January"
,
"February"
,
"March"
,
"April"
,
"May"
,
"June"
,
"July"
,
"August"
,
"September"
,
"October"
,
"November"
,
"December"
],
monthsShort
:[
"Jan"
,
"Feb"
,
"Mar"
,
"Apr"
,
"May"
,
"Jun"
,
"Jul"
,
"Aug"
,
"Sep"
,
"Oct"
,
"Nov"
,
"Dec"
],
today
:
"Today"
,
clear
:
"Clear"
}},
l
=
{
modes
:[{
clsName
:
"days"
,
navFnc
:
"Month"
,
navStep
:
1
},{
clsName
:
"months"
,
navFnc
:
"FullYear"
,
navStep
:
1
},{
clsName
:
"years"
,
navFnc
:
"FullYear"
,
navStep
:
10
}],
isLeapYear
:
function
(
a
){
return
0
===
a
%
4
&&
0
!==
a
%
100
||
0
===
a
%
400
},
getDaysInMonth
:
function
(
a
,
b
){
return
[
31
,
l
.
isLeapYear
(
a
)?
29
:
28
,
31
,
30
,
31
,
30
,
31
,
31
,
30
,
31
,
30
,
31
][
b
]},
validParts
:
/dd
?
|DD
?
|mm
?
|MM
?
|yy
(?:
yy
)?
/g
,
nonpunctuation
:
/
[^
-
\/
:-@
\[\u
3400-
\u
9fff-`{-~
\t\n\r]
+/g
,
parseFormat
:
function
(
a
){
var
b
=
a
.
replace
(
this
.
validParts
,
"
\
0"
).
split
(
"
\
0"
),
c
=
a
.
match
(
this
.
validParts
);
if
(
!
b
||!
b
.
length
||!
c
||
0
===
c
.
length
)
throw
new
Error
(
"Invalid date format."
);
return
{
separators
:
b
,
parts
:
c
}},
parseDate
:
function
(
c
,
d
,
f
){
if
(
c
instanceof
Date
)
return
c
;
if
(
"string"
==
typeof
d
&&
(
d
=
l
.
parseFormat
(
d
)),
/^
[\-
+
]\d
+
[
dmwy
]([\s
,
]
+
[\-
+
]\d
+
[
dmwy
])
*$/
.
test
(
c
)){
var
g
,
h
,
i
=
/
([\-
+
]\d
+
)([
dmwy
])
/
,
j
=
c
.
match
(
/
([\-
+
]\d
+
)([
dmwy
])
/g
);
c
=
new
Date
;
for
(
var
m
=
0
;
m
<
j
.
length
;
m
++
)
switch
(
g
=
i
.
exec
(
j
[
m
]),
h
=
parseInt
(
g
[
1
]),
g
[
2
]){
case
"d"
:
c
.
setUTCDate
(
c
.
getUTCDate
()
+
h
);
break
;
case
"m"
:
c
=
e
.
prototype
.
moveMonth
.
call
(
e
.
prototype
,
c
,
h
);
break
;
case
"w"
:
c
.
setUTCDate
(
c
.
getUTCDate
()
+
7
*
h
);
break
;
case
"y"
:
c
=
e
.
prototype
.
moveYear
.
call
(
e
.
prototype
,
c
,
h
)}
return
b
(
c
.
getUTCFullYear
(),
c
.
getUTCMonth
(),
c
.
getUTCDate
(),
0
,
0
,
0
)}
var
n
,
o
,
g
,
j
=
c
&&
c
.
match
(
this
.
nonpunctuation
)
||
[],
c
=
new
Date
,
p
=
{},
q
=
[
"yyyy"
,
"yy"
,
"M"
,
"MM"
,
"m"
,
"mm"
,
"d"
,
"dd"
],
r
=
{
yyyy
:
function
(
a
,
b
){
return
a
.
setUTCFullYear
(
b
)},
yy
:
function
(
a
,
b
){
return
a
.
setUTCFullYear
(
2
e3
+
b
)},
m
:
function
(
a
,
b
){
for
(
b
-=
1
;
0
>
b
;)
b
+=
12
;
for
(
b
%=
12
,
a
.
setUTCMonth
(
b
);
a
.
getUTCMonth
()
!=
b
;)
a
.
setUTCDate
(
a
.
getUTCDate
()
-
1
);
return
a
},
d
:
function
(
a
,
b
){
return
a
.
setUTCDate
(
b
)}};
r
.
M
=
r
.
MM
=
r
.
mm
=
r
.
m
,
r
.
dd
=
r
.
d
,
c
=
b
(
c
.
getFullYear
(),
c
.
getMonth
(),
c
.
getDate
(),
0
,
0
,
0
);
var
s
=
d
.
parts
.
slice
();
if
(
j
.
length
!=
s
.
length
&&
(
s
=
a
(
s
).
filter
(
function
(
b
,
c
){
return
-
1
!==
a
.
inArray
(
c
,
q
)}).
toArray
()),
j
.
length
==
s
.
length
){
for
(
var
m
=
0
,
t
=
s
.
length
;
t
>
m
;
m
++
){
if
(
n
=
parseInt
(
j
[
m
],
10
),
g
=
s
[
m
],
isNaN
(
n
))
switch
(
g
){
case
"MM"
:
o
=
a
(
k
[
f
].
months
).
filter
(
function
(){
var
a
=
this
.
slice
(
0
,
j
[
m
].
length
),
b
=
j
[
m
].
slice
(
0
,
a
.
length
);
return
a
==
b
}),
n
=
a
.
inArray
(
o
[
0
],
k
[
f
].
months
)
+
1
;
break
;
case
"M"
:
o
=
a
(
k
[
f
].
monthsShort
).
filter
(
function
(){
var
a
=
this
.
slice
(
0
,
j
[
m
].
length
),
b
=
j
[
m
].
slice
(
0
,
a
.
length
);
return
a
==
b
}),
n
=
a
.
inArray
(
o
[
0
],
k
[
f
].
monthsShort
)
+
1
}
p
[
g
]
=
n
}
for
(
var
u
,
m
=
0
;
m
<
q
.
length
;
m
++
)
u
=
q
[
m
],
u
in
p
&&!
isNaN
(
p
[
u
])
&&
r
[
u
](
c
,
p
[
u
])}
return
c
},
formatDate
:
function
(
b
,
c
,
d
){
"string"
==
typeof
c
&&
(
c
=
l
.
parseFormat
(
c
));
var
e
=
{
d
:
b
.
getUTCDate
(),
D
:
k
[
d
].
daysShort
[
b
.
getUTCDay
()],
DD
:
k
[
d
].
days
[
b
.
getUTCDay
()],
m
:
b
.
getUTCMonth
()
+
1
,
M
:
k
[
d
].
monthsShort
[
b
.
getUTCMonth
()],
MM
:
k
[
d
].
months
[
b
.
getUTCMonth
()],
yy
:
b
.
getUTCFullYear
().
toString
().
substring
(
2
),
yyyy
:
b
.
getUTCFullYear
()};
e
.
dd
=
(
e
.
d
<
10
?
"0"
:
""
)
+
e
.
d
,
e
.
mm
=
(
e
.
m
<
10
?
"0"
:
""
)
+
e
.
m
;
for
(
var
b
=
[],
f
=
a
.
extend
([],
c
.
separators
),
g
=
0
,
h
=
c
.
parts
.
length
;
h
>=
g
;
g
++
)
f
.
length
&&
b
.
push
(
f
.
shift
()),
b
.
push
(
e
[
c
.
parts
[
g
]]);
return
b
.
join
(
""
)},
headTemplate
:
'<thead><tr><th class="prev"><i class="icon-arrow-left"/></th><th colspan="5" class="datepicker-switch"></th><th class="next"><i class="icon-arrow-right"/></th></tr></thead>'
,
contTemplate
:
'<tbody><tr><td colspan="7"></td></tr></tbody>'
,
footTemplate
:
'<tfoot><tr><th colspan="7" class="today"></th></tr><tr><th colspan="7" class="clear"></th></tr></tfoot>'
};
l
.
template
=
'<div class="datepicker"><div class="datepicker-days"><table class=" table-condensed">'
+
l
.
headTemplate
+
"<tbody></tbody>"
+
l
.
footTemplate
+
"</table>"
+
"</div>"
+
'<div class="datepicker-months">'
+
'<table class="table-condensed">'
+
l
.
headTemplate
+
l
.
contTemplate
+
l
.
footTemplate
+
"</table>"
+
"</div>"
+
'<div class="datepicker-years">'
+
'<table class="table-condensed">'
+
l
.
headTemplate
+
l
.
contTemplate
+
l
.
footTemplate
+
"</table>"
+
"</div>"
+
"</div>"
,
a
.
fn
.
datepicker
.
DPGlobal
=
l
,
a
.
fn
.
datepicker
.
noConflict
=
function
(){
return
a
.
fn
.
datepicker
=
g
,
this
},
a
(
document
).
on
(
"focus.datepicker.data-api click.datepicker.data-api"
,
'[data-provide="datepicker"]'
,
function
(
b
){
var
c
=
a
(
this
);
c
.
data
(
"datepicker"
)
||
(
b
.
preventDefault
(),
h
.
call
(
c
,
"show"
))}),
a
(
function
(){
h
.
call
(
a
(
'[data-provide="datepicker-inline"]'
))})}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
a
.
fn
.
bdatepicker
=
a
.
fn
.
datepicker
.
noConflict
(),
a
.
fn
.
datepicker
||
(
a
.
fn
.
datepicker
=
a
.
fn
.
bdatepicker
);
var
b
=
function
(
a
){
this
.
init
(
"date"
,
a
,
b
.
defaults
),
this
.
initPicker
(
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
initPicker
:
function
(
b
,
c
){
this
.
options
.
viewformat
||
(
this
.
options
.
viewformat
=
this
.
options
.
format
),
b
.
datepicker
=
a
.
fn
.
editableutils
.
tryParseJson
(
b
.
datepicker
,
!
0
),
this
.
options
.
datepicker
=
a
.
extend
({},
c
.
datepicker
,
b
.
datepicker
,{
format
:
this
.
options
.
viewformat
}),
this
.
options
.
datepicker
.
language
=
this
.
options
.
datepicker
.
language
||
"en"
,
this
.
dpg
=
a
.
fn
.
bdatepicker
.
DPGlobal
,
this
.
parsedFormat
=
this
.
dpg
.
parseFormat
(
this
.
options
.
format
),
this
.
parsedViewFormat
=
this
.
dpg
.
parseFormat
(
this
.
options
.
viewformat
)},
render
:
function
(){
this
.
$input
.
bdatepicker
(
this
.
options
.
datepicker
),
this
.
options
.
clear
&&
(
this
.
$clear
=
a
(
'<a href="#"></a>'
).
html
(
this
.
options
.
clear
).
click
(
a
.
proxy
(
function
(
a
){
a
.
preventDefault
(),
a
.
stopPropagation
(),
this
.
clear
()},
this
)),
this
.
$tpl
.
parent
().
append
(
a
(
'<div class="editable-clear">'
).
append
(
this
.
$clear
)))},
value2html
:
function
(
a
,
c
){
var
d
=
a
?
this
.
dpg
.
formatDate
(
a
,
this
.
parsedViewFormat
,
this
.
options
.
datepicker
.
language
):
""
;
b
.
superclass
.
value2html
.
call
(
this
,
d
,
c
)},
html2value
:
function
(
a
){
return
this
.
parseDate
(
a
,
this
.
parsedViewFormat
)},
value2str
:
function
(
a
){
return
a
?
this
.
dpg
.
formatDate
(
a
,
this
.
parsedFormat
,
this
.
options
.
datepicker
.
language
):
""
},
str2value
:
function
(
a
){
return
this
.
parseDate
(
a
,
this
.
parsedFormat
)},
value2submit
:
function
(
a
){
return
this
.
value2str
(
a
)},
value2input
:
function
(
a
){
this
.
$input
.
bdatepicker
(
"update"
,
a
)},
input2value
:
function
(){
return
this
.
$input
.
data
(
"datepicker"
).
date
},
activate
:
function
(){},
clear
:
function
(){
this
.
$input
.
data
(
"datepicker"
).
date
=
null
,
this
.
$input
.
find
(
".active"
).
removeClass
(
"active"
),
this
.
options
.
showbuttons
||
this
.
$input
.
closest
(
"form"
).
submit
()},
autosubmit
:
function
(){
this
.
$input
.
on
(
"mouseup"
,
".day"
,
function
(
b
){
if
(
!
a
(
b
.
currentTarget
).
is
(
".old"
)
&&!
a
(
b
.
currentTarget
).
is
(
".new"
)){
var
c
=
a
(
this
).
closest
(
"form"
);
setTimeout
(
function
(){
c
.
submit
()},
200
)}})},
parseDate
:
function
(
a
,
b
){
var
c
,
d
=
null
;
return
a
&&
(
d
=
this
.
dpg
.
parseDate
(
a
,
b
,
this
.
options
.
datepicker
.
language
),
"string"
==
typeof
a
&&
(
c
=
this
.
dpg
.
formatDate
(
d
,
b
,
this
.
options
.
datepicker
.
language
),
a
!==
c
&&
(
d
=
null
))),
d
}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<div class="editable-date well"></div>'
,
inputclass
:
null
,
format
:
"yyyy-mm-dd"
,
viewformat
:
null
,
datepicker
:{
weekStart
:
0
,
startView
:
0
,
minViewMode
:
0
,
autoclose
:
!
1
},
clear
:
"× clear"
}),
a
.
fn
.
editabletypes
.
date
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"datefield"
,
a
,
b
.
defaults
),
this
.
initPicker
(
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
date
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
$input
=
this
.
$tpl
.
find
(
"input"
),
this
.
setClass
(),
this
.
setAttr
(
"placeholder"
),
this
.
$tpl
.
bdatepicker
(
this
.
options
.
datepicker
),
this
.
$input
.
off
(
"focus keydown"
),
this
.
$input
.
keyup
(
a
.
proxy
(
function
(){
this
.
$tpl
.
removeData
(
"date"
),
this
.
$tpl
.
bdatepicker
(
"update"
)},
this
))},
value2input
:
function
(
a
){
this
.
$input
.
val
(
a
?
this
.
dpg
.
formatDate
(
a
,
this
.
parsedViewFormat
,
this
.
options
.
datepicker
.
language
):
""
),
this
.
$tpl
.
bdatepicker
(
"update"
)},
input2value
:
function
(){
return
this
.
html2value
(
this
.
$input
.
val
())},
activate
:
function
(){
a
.
fn
.
editabletypes
.
text
.
prototype
.
activate
.
call
(
this
)},
autosubmit
:
function
(){}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
date
.
defaults
,{
tpl
:
'<div class="input-append date"><input type="text"/><span class="add-on"><i class="icon-th"></i></span></div>'
,
inputclass
:
"input-small"
,
datepicker
:{
weekStart
:
0
,
startView
:
0
,
minViewMode
:
0
,
autoclose
:
!
0
}}),
a
.
fn
.
editabletypes
.
datefield
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"datetime"
,
a
,
b
.
defaults
),
this
.
initPicker
(
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
abstractinput
),
a
.
extend
(
b
.
prototype
,{
initPicker
:
function
(
b
,
c
){
this
.
options
.
viewformat
||
(
this
.
options
.
viewformat
=
this
.
options
.
format
),
b
.
datetimepicker
=
a
.
fn
.
editableutils
.
tryParseJson
(
b
.
datetimepicker
,
!
0
),
this
.
options
.
datetimepicker
=
a
.
extend
({},
c
.
datetimepicker
,
b
.
datetimepicker
,{
format
:
this
.
options
.
viewformat
}),
this
.
options
.
datetimepicker
.
language
=
this
.
options
.
datetimepicker
.
language
||
"en"
,
this
.
dpg
=
a
.
fn
.
datetimepicker
.
DPGlobal
,
this
.
parsedFormat
=
this
.
dpg
.
parseFormat
(
this
.
options
.
format
,
this
.
options
.
formatType
),
this
.
parsedViewFormat
=
this
.
dpg
.
parseFormat
(
this
.
options
.
viewformat
,
this
.
options
.
formatType
)},
render
:
function
(){
this
.
$input
.
datetimepicker
(
this
.
options
.
datetimepicker
),
this
.
$input
.
on
(
"changeMode"
,
function
(){
var
b
=
a
(
this
).
closest
(
"form"
).
parent
();
setTimeout
(
function
(){
b
.
triggerHandler
(
"resize"
)},
0
)}),
this
.
options
.
clear
&&
(
this
.
$clear
=
a
(
'<a href="#"></a>'
).
html
(
this
.
options
.
clear
).
click
(
a
.
proxy
(
function
(
a
){
a
.
preventDefault
(),
a
.
stopPropagation
(),
this
.
clear
()},
this
)),
this
.
$tpl
.
parent
().
append
(
a
(
'<div class="editable-clear">'
).
append
(
this
.
$clear
)))},
value2html
:
function
(
a
,
c
){
var
d
=
a
?
this
.
dpg
.
formatDate
(
this
.
toUTC
(
a
),
this
.
parsedViewFormat
,
this
.
options
.
datetimepicker
.
language
,
this
.
options
.
formatType
):
""
;
return
c
?(
b
.
superclass
.
value2html
.
call
(
this
,
d
,
c
),
void
0
):
d
},
html2value
:
function
(
a
){
var
b
=
this
.
parseDate
(
a
,
this
.
parsedViewFormat
);
return
b
?
this
.
fromUTC
(
b
):
null
},
value2str
:
function
(
a
){
return
a
?
this
.
dpg
.
formatDate
(
this
.
toUTC
(
a
),
this
.
parsedFormat
,
this
.
options
.
datetimepicker
.
language
,
this
.
options
.
formatType
):
""
},
str2value
:
function
(
a
){
var
b
=
this
.
parseDate
(
a
,
this
.
parsedFormat
);
return
b
?
this
.
fromUTC
(
b
):
null
},
value2submit
:
function
(
a
){
return
this
.
value2str
(
a
)},
value2input
:
function
(
a
){
a
&&
this
.
$input
.
data
(
"datetimepicker"
).
setDate
(
a
)},
input2value
:
function
(){
var
a
=
this
.
$input
.
data
(
"datetimepicker"
);
return
a
.
date
?
a
.
getDate
():
null
},
activate
:
function
(){},
clear
:
function
(){
this
.
$input
.
data
(
"datetimepicker"
).
date
=
null
,
this
.
$input
.
find
(
".active"
).
removeClass
(
"active"
),
this
.
options
.
showbuttons
||
this
.
$input
.
closest
(
"form"
).
submit
()},
autosubmit
:
function
(){
this
.
$input
.
on
(
"mouseup"
,
".minute"
,
function
(){
var
b
=
a
(
this
).
closest
(
"form"
);
setTimeout
(
function
(){
b
.
submit
()},
200
)})},
toUTC
:
function
(
a
){
return
a
?
new
Date
(
a
.
valueOf
()
-
6
e4
*
a
.
getTimezoneOffset
()):
a
},
fromUTC
:
function
(
a
){
return
a
?
new
Date
(
a
.
valueOf
()
+
6
e4
*
a
.
getTimezoneOffset
()):
a
},
parseDate
:
function
(
a
,
b
){
var
c
,
d
=
null
;
return
a
&&
(
d
=
this
.
dpg
.
parseDate
(
a
,
b
,
this
.
options
.
datetimepicker
.
language
,
this
.
options
.
formatType
),
"string"
==
typeof
a
&&
(
c
=
this
.
dpg
.
formatDate
(
d
,
b
,
this
.
options
.
datetimepicker
.
language
,
this
.
options
.
formatType
),
a
!==
c
&&
(
d
=
null
))),
d
}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
abstractinput
.
defaults
,{
tpl
:
'<div class="editable-date well"></div>'
,
inputclass
:
null
,
format
:
"yyyy-mm-dd hh:ii"
,
formatType
:
"standard"
,
viewformat
:
null
,
datetimepicker
:{
todayHighlight
:
!
1
,
autoclose
:
!
1
},
clear
:
"× clear"
}),
a
.
fn
.
editabletypes
.
datetime
=
b
}(
window
.
jQuery
),
function
(
a
){
"use strict"
;
var
b
=
function
(
a
){
this
.
init
(
"datetimefield"
,
a
,
b
.
defaults
),
this
.
initPicker
(
a
,
b
.
defaults
)};
a
.
fn
.
editableutils
.
inherit
(
b
,
a
.
fn
.
editabletypes
.
datetime
),
a
.
extend
(
b
.
prototype
,{
render
:
function
(){
this
.
$input
=
this
.
$tpl
.
find
(
"input"
),
this
.
setClass
(),
this
.
setAttr
(
"placeholder"
),
this
.
$tpl
.
datetimepicker
(
this
.
options
.
datetimepicker
),
this
.
$input
.
off
(
"focus keydown"
),
this
.
$input
.
keyup
(
a
.
proxy
(
function
(){
this
.
$tpl
.
removeData
(
"date"
),
this
.
$tpl
.
datetimepicker
(
"update"
)},
this
))},
value2input
:
function
(
a
){
this
.
$input
.
val
(
this
.
value2html
(
a
)),
this
.
$tpl
.
datetimepicker
(
"update"
)},
input2value
:
function
(){
return
this
.
html2value
(
this
.
$input
.
val
())},
activate
:
function
(){
a
.
fn
.
editabletypes
.
text
.
prototype
.
activate
.
call
(
this
)},
autosubmit
:
function
(){}}),
b
.
defaults
=
a
.
extend
({},
a
.
fn
.
editabletypes
.
datetime
.
defaults
,{
tpl
:
'<div class="input-append date"><input type="text"/><span class="add-on"><i class="icon-th"></i></span></div>'
,
inputclass
:
"input-medium"
,
datetimepicker
:{
todayHighlight
:
!
1
,
autoclose
:
!
0
}}),
a
.
fn
.
editabletypes
.
datetimefield
=
b
}(
window
.
jQuery
);
\ No newline at end of file
flask_admin/templates/bootstrap2/admin/lib.html
View file @
2b4bfe35
...
...
@@ -178,6 +178,9 @@
<link
href=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.css') }}"
rel=
"stylesheet"
>
<link
href=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css') }}"
rel=
"stylesheet"
>
{% endif %}
{% if editable_columns %}
<link
href=
"{{ admin_static.url(filename='vendor/x-editable/css/bootstrap2-editable-1.5.1.css') }}"
rel=
"stylesheet"
>
{% endif %}
{% endmacro %}
{% macro form_js() %}
...
...
@@ -189,5 +192,8 @@
<script
src=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js') }}"
></script>
{% endif %}
<script
src=
"{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js') }}"
></script>
{% if editable_columns %}
<script
src=
"{{ admin_static.url(filename='vendor/x-editable/js/bootstrap2-editable-1.5.1.min.js') }}"
></script>
{% endif %}
<script
src=
"{{ admin_static.url(filename='admin/js/form-1.0.0.js') }}"
></script>
{% endmacro %}
flask_admin/templates/bootstrap2/admin/model/list.html
View file @
2b4bfe35
...
...
@@ -119,8 +119,17 @@
{% endblock %}
</td>
{% endblock %}
{% for c, name in list_columns %}
<td>
{{ get_value(row, c) }}
</td>
{% if admin_view.is_editable(c) %}
{% if form.csrf_token %}
<td>
{{ form[c](pk=get_pk_value(row), value=get_value(row, c), csrf=form.csrf_token._value()) }}
</td>
{% else %}
<td>
{{ form[c](pk=get_pk_value(row), value=get_value(row, c)) }}
</td>
{% endif %}
{% else %}
<td>
{{ get_value(row, c) }}
</td>
{% endif %}
{% endfor %}
{% endblock %}
</tr>
...
...
@@ -148,8 +157,8 @@
<script
src=
"{{ admin_static.url(filename='admin/js/filters-1.0.0.js') }}"
></script>
{{ actionlib.script(_gettext('Please select at least one record.'),
actions,
actions_confirmation) }}
actions,
actions_confirmation) }}
<script
language=
"javascript"
>
(
function
(
$
)
{
...
...
flask_admin/templates/bootstrap3/admin/lib.html
View file @
2b4bfe35
...
...
@@ -147,13 +147,13 @@
<hr>
<div
class=
"form-group"
>
<div
class=
"col-md-offset-2 col-md-10 submit-row"
>
<input
type=
"submit"
class=
"btn btn-primary"
value=
"{{ _gettext('Submit') }}"
/>
{% if extra %}
{{ extra }}
{% endif %}
{% if cancel_url %}
<a
href=
"{{ cancel_url }}"
class=
"btn btn-danger"
role=
"button"
>
{{ _gettext('Cancel') }}
</a>
{% endif %}
<input
type=
"submit"
class=
"btn btn-primary"
value=
"{{ _gettext('Submit') }}"
/>
{% if extra %}
{{ extra }}
{% endif %}
{% if cancel_url %}
<a
href=
"{{ cancel_url }}"
class=
"btn btn-danger"
role=
"button"
>
{{ _gettext('Cancel') }}
</a>
{% endif %}
</div>
</div>
{% endmacro %}
...
...
@@ -173,6 +173,9 @@
<link
href=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.css') }}"
rel=
"stylesheet"
>
<link
href=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css') }}"
rel=
"stylesheet"
>
{% endif %}
{% if editable_columns %}
<link
href=
"{{ admin_static.url(filename='vendor/x-editable/css/bootstrap3-editable-1.5.1.css') }}"
rel=
"stylesheet"
>
{% endif %}
{% endmacro %}
{% macro form_js() %}
...
...
@@ -184,5 +187,8 @@
<script
src=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js') }}"
></script>
{% endif %}
<script
src=
"{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js') }}"
></script>
{% if editable_columns %}
<script
src=
"{{ admin_static.url(filename='vendor/x-editable/js/bootstrap3-editable-1.5.1.min.js') }}"
></script>
{% endif %}
<script
src=
"{{ admin_static.url(filename='admin/js/form-1.0.0.js') }}"
></script>
{% endmacro %}
flask_admin/templates/bootstrap3/admin/model/list.html
View file @
2b4bfe35
...
...
@@ -120,7 +120,15 @@
</td>
{% endblock %}
{% for c, name in list_columns %}
<td>
{{ get_value(row, c) }}
</td>
{% if admin_view.is_editable(c) %}
{% if form.csrf_token %}
<td>
{{ form[c](pk=get_pk_value(row), value=get_value(row, c), csrf=form.csrf_token._value()) }}
</td>
{% else %}
<td>
{{ form[c](pk=get_pk_value(row), value=get_value(row, c)) }}
</td>
{% endif %}
{% else %}
<td>
{{ get_value(row, c) }}
</td>
{% endif %}
{% endfor %}
{% endblock %}
</tr>
...
...
@@ -148,8 +156,8 @@
{{ lib.form_js() }}
{{ actionlib.script(_gettext('Please select at least one record.'),
actions,
actions_confirmation) }}
actions,
actions_confirmation) }}
<script
language=
"javascript"
>
(
function
(
$
)
{
...
...
flask_admin/tests/mongoengine/test_basic.py
View file @
2b4bfe35
...
...
@@ -52,6 +52,22 @@ def create_models(db):
return
Model1
,
Model2
def
fill_db
(
Model1
,
Model2
):
Model1
(
'test1_val_1'
,
'test2_val_1'
)
.
save
()
Model1
(
'test1_val_2'
,
'test2_val_2'
)
.
save
()
Model1
(
'test1_val_3'
,
'test2_val_3'
)
.
save
()
Model1
(
'test1_val_4'
,
'test2_val_4'
)
.
save
()
Model1
(
None
,
'empty_obj'
)
.
save
()
Model2
(
'string_field_val_1'
,
None
,
None
)
.
save
()
Model2
(
'string_field_val_2'
,
None
,
None
)
.
save
()
Model2
(
'string_field_val_3'
,
5000
,
25.9
)
.
save
()
Model2
(
'string_field_val_4'
,
9000
,
75.5
)
.
save
()
Model1
(
'datetime_obj1'
,
datetime_field
=
datetime
(
2014
,
4
,
3
,
1
,
9
,
0
))
.
save
()
Model1
(
'datetime_obj2'
,
datetime_field
=
datetime
(
2013
,
3
,
2
,
0
,
8
,
0
))
.
save
()
def
test_model
():
app
,
db
,
admin
=
setup
()
...
...
@@ -124,25 +140,86 @@ def test_model():
eq_
(
rv
.
status_code
,
302
)
eq_
(
Model1
.
objects
.
count
(),
0
)
def
test_column_editable_list
():
app
,
db
,
admin
=
setup
()
Model1
,
Model2
=
create_models
(
db
)
view
=
CustomModelView
(
Model1
,
column_editable_list
=
[
'test1'
,
'datetime_field'
])
admin
.
add_view
(
view
)
fill_db
(
Model1
,
Model2
)
client
=
app
.
test_client
()
# Test in-line edit field rendering
rv
=
client
.
get
(
'/admin/model1/'
)
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'data-role="x-editable"'
in
data
)
# Form - Test basic in-line edit functionality
obj1
=
Model1
.
objects
.
get
(
test1
=
'test1_val_3'
)
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'test1-'
+
str
(
obj1
.
id
):
'change-success-1'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'Record was successfully saved.'
==
data
)
# confirm the value has changed
rv
=
client
.
get
(
'/admin/model1/'
)
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'change-success-1'
in
data
)
# Test validation error
obj2
=
Model1
.
objects
.
get
(
test1
=
'datetime_obj1'
)
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'datetime_field-'
+
str
(
obj2
.
id
):
'problematic-input'
,
})
eq_
(
rv
.
status_code
,
500
)
# Test invalid primary key
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'test1-1000'
:
'problematic-input'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
eq_
(
rv
.
status_code
,
500
)
# Test editing column not in column_editable_list
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'test2-1'
:
'problematic-input'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
eq_
(
rv
.
status_code
,
500
)
# Test in-line editing for relations
view
=
CustomModelView
(
Model2
,
column_editable_list
=
[
'model1'
])
admin
.
add_view
(
view
)
obj3
=
Model2
.
objects
.
get
(
string_field
=
'string_field_val_1'
)
rv
=
client
.
post
(
'/admin/model2/ajax/update/'
,
data
=
{
'model1-'
+
str
(
obj3
.
id
):
str
(
obj1
.
id
),
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'Record was successfully saved.'
==
data
)
# confirm the value has changed
rv
=
client
.
get
(
'/admin/model2/'
)
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'test1_val_1'
in
data
)
def
test_column_filters
():
app
,
db
,
admin
=
setup
()
Model1
,
Model2
=
create_models
(
db
)
# fill DB with values
Model1
(
'test1_val_1'
,
'test2_val_1'
)
.
save
()
Model1
(
'test1_val_2'
,
'test2_val_2'
)
.
save
()
Model1
(
'test1_val_3'
,
'test2_val_3'
)
.
save
()
Model1
(
'test1_val_4'
,
'test2_val_4'
)
.
save
()
Model1
(
None
,
'empty_obj'
)
.
save
()
Model2
(
'string_field_val_1'
,
None
,
None
)
.
save
()
Model2
(
'string_field_val_2'
,
None
,
None
)
.
save
()
Model2
(
'string_field_val_3'
,
5000
,
25.9
)
.
save
()
Model2
(
'string_field_val_4'
,
9000
,
75.5
)
.
save
()
Model1
(
'datetime_obj1'
,
datetime_field
=
datetime
(
2014
,
4
,
3
,
1
,
9
,
0
))
.
save
()
Model1
(
'datetime_obj2'
,
datetime_field
=
datetime
(
2013
,
3
,
2
,
0
,
8
,
0
))
.
save
()
fill_db
(
Model1
,
Model2
)
# Test string filter
view
=
CustomModelView
(
Model1
,
column_filters
=
[
'test1'
])
...
...
flask_admin/tests/peeweemodel/test_basic.py
View file @
2b4bfe35
...
...
@@ -57,9 +57,11 @@ def create_models(db):
date_field
=
peewee
.
DateField
(
null
=
True
)
timeonly_field
=
peewee
.
TimeField
(
null
=
True
)
datetime_field
=
peewee
.
DateTimeField
(
null
=
True
)
def
__str__
(
self
):
return
self
.
test1
# "or ''" fixes error when loading choices for relation field:
# TypeError: coercing to Unicode: need string or buffer, NoneType found
return
self
.
test1
or
''
class
Model2
(
BaseModel
):
def
__init__
(
self
,
char_field
=
None
,
int_field
=
None
,
float_field
=
None
,
...
...
@@ -70,18 +72,41 @@ def create_models(db):
self
.
int_field
=
int_field
self
.
float_field
=
float_field
self
.
bool_field
=
bool_field
char_field
=
peewee
.
CharField
(
max_length
=
20
)
int_field
=
peewee
.
IntegerField
(
null
=
True
)
float_field
=
peewee
.
FloatField
(
null
=
True
)
bool_field
=
peewee
.
BooleanField
()
# Relation
model1
=
peewee
.
ForeignKeyField
(
Model1
,
null
=
True
)
Model1
.
create_table
()
Model2
.
create_table
()
return
Model1
,
Model2
def
fill_db
(
Model1
,
Model2
):
Model1
(
'test1_val_1'
,
'test2_val_1'
)
.
save
()
Model1
(
'test1_val_2'
,
'test2_val_2'
)
.
save
()
Model1
(
'test1_val_3'
,
'test2_val_3'
)
.
save
()
Model1
(
'test1_val_4'
,
'test2_val_4'
)
.
save
()
Model1
(
None
,
'empty_obj'
)
.
save
()
Model2
(
'char_field_val_1'
,
None
,
None
)
.
save
()
Model2
(
'char_field_val_2'
,
None
,
None
)
.
save
()
Model2
(
'char_field_val_3'
,
5000
,
25.9
)
.
save
()
Model2
(
'char_field_val_4'
,
9000
,
75.5
)
.
save
()
Model1
(
'date_obj1'
,
date_field
=
date
(
2014
,
11
,
17
))
.
save
()
Model1
(
'date_obj2'
,
date_field
=
date
(
2013
,
10
,
16
))
.
save
()
Model1
(
'timeonly_obj1'
,
timeonly_field
=
time
(
11
,
10
,
9
))
.
save
()
Model1
(
'timeonly_obj2'
,
timeonly_field
=
time
(
10
,
9
,
8
))
.
save
()
Model1
(
'datetime_obj1'
,
datetime_field
=
datetime
(
2014
,
4
,
3
,
1
,
9
,
0
))
.
save
()
Model1
(
'datetime_obj2'
,
datetime_field
=
datetime
(
2013
,
3
,
2
,
0
,
8
,
0
))
.
save
()
def
test_model
():
app
,
db
,
admin
=
setup
()
Model1
,
Model2
=
create_models
(
db
)
...
...
@@ -153,29 +178,82 @@ def test_model():
eq_
(
rv
.
status_code
,
302
)
eq_
(
Model1
.
select
()
.
count
(),
0
)
def
test_column_editable_list
():
app
,
db
,
admin
=
setup
()
Model1
,
Model2
=
create_models
(
db
)
view
=
CustomModelView
(
Model1
,
column_editable_list
=
[
'test1'
,
'enum_field'
])
admin
.
add_view
(
view
)
fill_db
(
Model1
,
Model2
)
client
=
app
.
test_client
()
# Test in-line edit field rendering
rv
=
client
.
get
(
'/admin/model1/'
)
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'data-role="x-editable"'
in
data
)
# Form - Test basic in-line edit functionality
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'test1-1'
:
'change-success-1'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'Record was successfully saved.'
==
data
)
# ensure the value has changed
rv
=
client
.
get
(
'/admin/model1/'
)
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'change-success-1'
in
data
)
# Test validation error
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'enum_field-1'
:
'problematic-input'
,
})
eq_
(
rv
.
status_code
,
500
)
# Test invalid primary key
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'test1-1000'
:
'problematic-input'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
eq_
(
rv
.
status_code
,
500
)
# Test editing column not in column_editable_list
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'test2-1'
:
'problematic-input'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
eq_
(
rv
.
status_code
,
500
)
# Test in-line editing for relations
view
=
CustomModelView
(
Model2
,
column_editable_list
=
[
'model1'
])
admin
.
add_view
(
view
)
rv
=
client
.
post
(
'/admin/model2/ajax/update/'
,
data
=
{
'model1-1'
:
'3'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'Record was successfully saved.'
==
data
)
# confirm the value has changed
rv
=
client
.
get
(
'/admin/model2/'
)
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'test1_val_3'
in
data
)
def
test_column_filters
():
app
,
db
,
admin
=
setup
()
Model1
,
Model2
=
create_models
(
db
)
# fill DB with values
Model1
(
'test1_val_1'
,
'test2_val_1'
)
.
save
()
Model1
(
'test1_val_2'
,
'test2_val_2'
)
.
save
()
Model1
(
'test1_val_3'
,
'test2_val_3'
)
.
save
()
Model1
(
'test1_val_4'
,
'test2_val_4'
)
.
save
()
Model1
(
None
,
'empty_obj'
)
.
save
()
Model2
(
'char_field_val_1'
,
None
,
None
)
.
save
()
Model2
(
'char_field_val_2'
,
None
,
None
)
.
save
()
Model2
(
'char_field_val_3'
,
5000
,
25.9
)
.
save
()
Model2
(
'char_field_val_4'
,
9000
,
75.5
)
.
save
()
Model1
(
'date_obj1'
,
date_field
=
date
(
2014
,
11
,
17
))
.
save
()
Model1
(
'date_obj2'
,
date_field
=
date
(
2013
,
10
,
16
))
.
save
()
Model1
(
'timeonly_obj1'
,
timeonly_field
=
time
(
11
,
10
,
9
))
.
save
()
Model1
(
'timeonly_obj2'
,
timeonly_field
=
time
(
10
,
9
,
8
))
.
save
()
Model1
(
'datetime_obj1'
,
datetime_field
=
datetime
(
2014
,
4
,
3
,
1
,
9
,
0
))
.
save
()
Model1
(
'datetime_obj2'
,
datetime_field
=
datetime
(
2013
,
3
,
2
,
0
,
8
,
0
))
.
save
()
fill_db
(
Model1
,
Model2
)
# Test string filter
view
=
CustomModelView
(
Model1
,
column_filters
=
[
'test1'
])
...
...
flask_admin/tests/sqla/test_basic.py
View file @
2b4bfe35
...
...
@@ -81,6 +81,39 @@ def create_models(db):
return
Model1
,
Model2
def
fill_db
(
db
,
Model1
,
Model2
):
model1_obj1
=
Model1
(
'test1_val_1'
,
'test2_val_1'
,
bool_field
=
True
)
model1_obj2
=
Model1
(
'test1_val_2'
,
'test2_val_2'
)
model1_obj3
=
Model1
(
'test1_val_3'
,
'test2_val_3'
)
model1_obj4
=
Model1
(
'test1_val_4'
,
'test2_val_4'
)
model2_obj1
=
Model2
(
'test2_val_1'
,
model1
=
model1_obj1
,
float_field
=
None
)
model2_obj2
=
Model2
(
'test2_val_2'
,
model1
=
model1_obj2
,
float_field
=
None
)
model2_obj3
=
Model2
(
'test2_val_3'
,
int_field
=
5000
,
float_field
=
25.9
)
model2_obj4
=
Model2
(
'test2_val_4'
,
int_field
=
9000
,
float_field
=
75.5
)
date_obj1
=
Model1
(
'date_obj1'
,
date_field
=
date
(
2014
,
11
,
17
))
date_obj2
=
Model1
(
'date_obj2'
,
date_field
=
date
(
2013
,
10
,
16
))
timeonly_obj1
=
Model1
(
'timeonly_obj1'
,
time_field
=
time
(
11
,
10
,
9
))
timeonly_obj2
=
Model1
(
'timeonly_obj2'
,
time_field
=
time
(
10
,
9
,
8
))
datetime_obj1
=
Model1
(
'datetime_obj1'
,
datetime_field
=
datetime
(
2014
,
4
,
3
,
1
,
9
,
0
))
datetime_obj2
=
Model1
(
'datetime_obj2'
,
datetime_field
=
datetime
(
2013
,
3
,
2
,
0
,
8
,
0
))
enum_obj1
=
Model1
(
'enum_obj1'
,
enum_field
=
"model1_v1"
)
enum_obj2
=
Model1
(
'enum_obj2'
,
enum_field
=
"model1_v2"
)
empty_obj
=
Model1
(
test2
=
"empty_obj"
)
db
.
session
.
add_all
([
model1_obj1
,
model1_obj2
,
model1_obj3
,
model1_obj4
,
model2_obj1
,
model2_obj2
,
model2_obj3
,
model2_obj4
,
date_obj1
,
timeonly_obj1
,
datetime_obj1
,
date_obj2
,
timeonly_obj2
,
datetime_obj2
,
enum_obj1
,
enum_obj2
,
empty_obj
])
db
.
session
.
commit
()
def
test_model
():
app
,
db
,
admin
=
setup
()
Model1
,
Model2
=
create_models
(
db
)
...
...
@@ -286,6 +319,75 @@ def test_complex_searchable_list_missing_children():
ok_
(
'magic string'
in
data
)
def
test_column_editable_list
():
app
,
db
,
admin
=
setup
()
Model1
,
Model2
=
create_models
(
db
)
view
=
CustomModelView
(
Model1
,
db
.
session
,
column_editable_list
=
[
'test1'
,
'enum_field'
])
admin
.
add_view
(
view
)
fill_db
(
db
,
Model1
,
Model2
)
client
=
app
.
test_client
()
# Test in-line edit field rendering
rv
=
client
.
get
(
'/admin/model1/'
)
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'data-role="x-editable"'
in
data
)
# Form - Test basic in-line edit functionality
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'test1-1'
:
'change-success-1'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'Record was successfully saved.'
==
data
)
# ensure the value has changed
rv
=
client
.
get
(
'/admin/model1/'
)
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'change-success-1'
in
data
)
# Test validation error
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'enum_field-1'
:
'problematic-input'
,
})
eq_
(
rv
.
status_code
,
500
)
# Test invalid primary key
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'test1-1000'
:
'problematic-input'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
eq_
(
rv
.
status_code
,
500
)
# Test editing column not in column_editable_list
rv
=
client
.
post
(
'/admin/model1/ajax/update/'
,
data
=
{
'test2-1'
:
'problematic-input'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
eq_
(
rv
.
status_code
,
500
)
# Test in-line editing for relations
view
=
CustomModelView
(
Model2
,
db
.
session
,
column_editable_list
=
[
'model1'
])
admin
.
add_view
(
view
)
rv
=
client
.
post
(
'/admin/model2/ajax/update/'
,
data
=
{
'model1-1'
:
'3'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'Record was successfully saved.'
==
data
)
# confirm the value has changed
rv
=
client
.
get
(
'/admin/model2/'
)
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'test1_val_3'
in
data
)
def
test_column_filters
():
app
,
db
,
admin
=
setup
()
...
...
@@ -393,37 +495,7 @@ def test_column_filters():
eq_
(
list
(
view
.
_filter_groups
.
keys
()),
[
u'Test Filter #1'
,
u'Test Filter #2'
])
# Fill DB
model1_obj1
=
Model1
(
'test1_val_1'
,
'test2_val_1'
,
bool_field
=
True
)
model1_obj2
=
Model1
(
'test1_val_2'
,
'test2_val_2'
)
model1_obj3
=
Model1
(
'test1_val_3'
,
'test2_val_3'
)
model1_obj4
=
Model1
(
'test1_val_4'
,
'test2_val_4'
)
model2_obj1
=
Model2
(
'test2_val_1'
,
model1
=
model1_obj1
,
float_field
=
None
)
model2_obj2
=
Model2
(
'test2_val_2'
,
model1
=
model1_obj2
,
float_field
=
None
)
model2_obj3
=
Model2
(
'test2_val_3'
,
int_field
=
5000
,
float_field
=
25.9
)
model2_obj4
=
Model2
(
'test2_val_4'
,
int_field
=
9000
,
float_field
=
75.5
)
date_obj1
=
Model1
(
'date_obj1'
,
date_field
=
date
(
2014
,
11
,
17
))
date_obj2
=
Model1
(
'date_obj2'
,
date_field
=
date
(
2013
,
10
,
16
))
timeonly_obj1
=
Model1
(
'timeonly_obj1'
,
time_field
=
time
(
11
,
10
,
9
))
timeonly_obj2
=
Model1
(
'timeonly_obj2'
,
time_field
=
time
(
10
,
9
,
8
))
datetime_obj1
=
Model1
(
'datetime_obj1'
,
datetime_field
=
datetime
(
2014
,
4
,
3
,
1
,
9
,
0
))
datetime_obj2
=
Model1
(
'datetime_obj2'
,
datetime_field
=
datetime
(
2013
,
3
,
2
,
0
,
8
,
0
))
enum_obj1
=
Model1
(
'enum_obj1'
,
enum_field
=
"model1_v1"
)
enum_obj2
=
Model1
(
'enum_obj2'
,
enum_field
=
"model1_v2"
)
empty_obj
=
Model1
(
test2
=
"empty_obj"
)
db
.
session
.
add_all
([
model1_obj1
,
model1_obj2
,
model1_obj3
,
model1_obj4
,
model2_obj1
,
model2_obj2
,
model2_obj3
,
model2_obj4
,
date_obj1
,
timeonly_obj1
,
datetime_obj1
,
date_obj2
,
timeonly_obj2
,
datetime_obj2
,
enum_obj1
,
enum_obj2
,
empty_obj
])
db
.
session
.
commit
()
fill_db
(
db
,
Model1
,
Model2
)
client
=
app
.
test_client
()
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment