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
eb37f32c
Commit
eb37f32c
authored
Dec 29, 2014
by
Paul Brown
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add editable list view
parent
ba4e10ce
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
2079 additions
and
114 deletions
+2079
-114
view.py
flask_admin/contrib/mongoengine/view.py
+52
-1
view.py
flask_admin/contrib/peewee/view.py
+55
-1
view.py
flask_admin/contrib/sqla/view.py
+56
-1
base.py
flask_admin/model/base.py
+126
-33
fields.py
flask_admin/model/fields.py
+55
-1
widgets.py
flask_admin/model/widgets.py
+78
-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
+76
-13
test_basic.py
flask_admin/tests/peeweemodel/test_basic.py
+77
-19
test_basic.py
flask_admin/tests/sqla/test_basic.py
+84
-31
No files found.
flask_admin/contrib/mongoengine/view.py
View file @
eb37f32c
...
...
@@ -6,13 +6,16 @@ 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._compat
import
iteritems
,
string_types
from
flask.ext.admin.actions
import
action
from
flask.ext.admin.model.fields
import
ListEditableFieldList
from
wtforms.fields.core
import
UnboundField
import
mongoengine
import
gridfs
from
mongoengine.connection
import
get_db
from
bson.objectid
import
ObjectId
from
flask.ext.admin.actions
import
action
from
.filters
import
FilterConverter
,
BaseMongoEngineFilter
from
.form
import
get_form
,
CustomModelConverter
from
.typefmt
import
DEFAULT_FORMATTERS
...
...
@@ -398,6 +401,23 @@ class ModelView(BaseModelView):
return
form_class
def
scaffold_list_form
(
self
):
"""
Create form for the list view editable columns.
"""
form_class
=
get_form
(
self
.
model
,
self
.
model_form_converter
(
self
),
base_class
=
self
.
form_base_class
,
only
=
self
.
column_editable_list
)
# iterate FormMeta to get unbound fields
field_dict
=
{}
for
name
,
field_object
in
iteritems
(
form_class
.
__dict__
):
if
not
name
.
startswith
(
'_'
)
and
isinstance
(
field_object
,
UnboundField
):
# wrap each field in the form from get_form in FieldList
field_dict
[
name
]
=
ListEditableFieldList
(
field_object
)
return
type
(
self
.
model
.
__name__
+
'Form'
,
(
self
.
form_base_class
,
),
field_dict
)
# AJAX foreignkey support
def
_create_ajax_loader
(
self
,
name
,
opts
):
return
create_ajax_loader
(
self
.
model
,
name
,
name
,
opts
)
...
...
@@ -545,6 +565,37 @@ class ModelView(BaseModelView):
return
True
def
update_list_model
(
self
,
form
):
"""
Update model from the list view.
Only supports updating a single field at a time.
:param form:
Form instance
"""
try
:
model
=
self
.
model
()
for
field
in
form
:
# FieldList's last_index will only be set if a field is submitted
# last_index will be the primary key of the updated record
if
getattr
(
field
,
'last_index'
,
None
):
record
=
self
.
get_one
(
field
.
last_index
)
setattr
(
record
,
field
.
name
,
field
.
data
.
pop
())
self
.
_on_model_change
(
form
,
model
,
False
)
record
.
save
()
self
.
after_model_change
(
form
,
model
,
False
)
return
True
except
Exception
as
ex
:
if
not
self
.
handle_view_exception
(
ex
):
log
.
exception
(
gettext
(
'Failed to update record.
%(error)
s'
,
error
=
str
(
ex
)),
'error'
)
self
.
session
.
rollback
()
# Error: Unable to update database or no records were changed.
return
False
def
delete_model
(
self
,
model
):
"""
Delete model helper
...
...
flask_admin/contrib/peewee/view.py
View file @
eb37f32c
...
...
@@ -2,7 +2,7 @@ import logging
from
flask
import
flash
from
flask.ext.admin._compat
import
string_types
from
flask.ext.admin._compat
import
string_types
,
iteritems
from
flask.ext.admin.babel
import
gettext
,
ngettext
,
lazy_gettext
from
flask.ext.admin.model
import
BaseModelView
...
...
@@ -11,6 +11,9 @@ from peewee import PrimaryKeyField, ForeignKeyField, Field, CharField, TextField
from
flask.ext.admin.actions
import
action
from
flask.ext.admin.contrib.peewee
import
filters
from
flask.ext.admin.model.fields
import
ListEditableFieldList
from
wtforms.fields.core
import
UnboundField
from
.form
import
get_form
,
CustomModelConverter
,
InlineModelConverter
,
save_inline
from
.tools
import
get_primary_key
,
parse_like_term
from
.ajax
import
create_ajax_loader
...
...
@@ -237,6 +240,23 @@ class ModelView(BaseModelView):
return
form_class
def
scaffold_list_form
(
self
):
"""
Create form for the list view editable columns.
"""
form_class
=
get_form
(
self
.
model
,
self
.
model_form_converter
(
self
),
base_class
=
self
.
form_base_class
,
only
=
self
.
column_editable_list
)
# iterate FormMeta to get unbound fields
field_dict
=
{}
for
name
,
field_object
in
iteritems
(
form_class
.
__dict__
):
if
not
name
.
startswith
(
'_'
)
and
isinstance
(
field_object
,
UnboundField
):
# wrap each field in the form from get_form in FieldList
field_dict
[
name
]
=
ListEditableFieldList
(
field_object
)
return
type
(
self
.
model
.
__name__
+
'Form'
,
(
self
.
form_base_class
,
),
field_dict
)
def
scaffold_inline_form_models
(
self
,
form_class
):
converter
=
self
.
model_form_converter
(
self
)
inline_converter
=
self
.
inline_model_form_converter
(
self
)
...
...
@@ -382,6 +402,40 @@ class ModelView(BaseModelView):
return
True
def
update_list_model
(
self
,
form
):
"""
Update model from the list view.
Only supports updating a single field at a time.
:param form:
Form instance
"""
try
:
model
=
self
.
model
()
for
field
in
form
:
# FieldList's last_index will only be set if a field is submitted
# last_index will be the primary key of the updated record
if
getattr
(
field
,
'last_index'
,
None
):
record
=
self
.
get_one
(
field
.
last_index
)
setattr
(
record
,
field
.
name
,
field
.
data
.
pop
())
self
.
_on_model_change
(
form
,
model
,
False
)
record
.
save
()
# For peewee have to save inline forms after model was saved
save_inline
(
form
,
model
)
self
.
after_model_change
(
form
,
model
,
False
)
return
True
except
Exception
as
ex
:
if
not
self
.
handle_view_exception
(
ex
):
log
.
exception
(
gettext
(
'Failed to update record.
%(error)
s'
,
error
=
str
(
ex
)),
'error'
)
self
.
session
.
rollback
()
# Error: Unable to update database or no records were changed.
return
False
def
delete_model
(
self
,
model
):
try
:
self
.
on_model_delete
(
model
)
...
...
flask_admin/contrib/sqla/view.py
View file @
eb37f32c
...
...
@@ -8,12 +8,15 @@ from sqlalchemy.exc import IntegrityError
from
flask
import
flash
from
flask.ext.admin._compat
import
string_types
from
flask.ext.admin._compat
import
string_types
,
iteritems
from
flask.ext.admin.babel
import
gettext
,
ngettext
,
lazy_gettext
from
flask.ext.admin.model
import
BaseModelView
from
flask.ext.admin.actions
import
action
from
flask.ext.admin._backwards
import
ObsoleteAttr
from
flask.ext.admin.model.fields
import
ListEditableFieldList
from
wtforms.fields.core
import
UnboundField
from
flask.ext.admin.contrib.sqla
import
form
,
filters
,
tools
from
.typefmt
import
DEFAULT_FORMATTERS
from
.tools
import
get_query_for_ids
...
...
@@ -611,6 +614,27 @@ class ModelView(BaseModelView):
return
form_class
def
scaffold_list_form
(
self
):
"""
Create form for the list view editable columns.
The form is created using the existing get_form(),
but each field is wrapped in a WTForms FieldList.
"""
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
)
# iterate FormMeta to get unbound fields
field_dict
=
{}
for
name
,
field_object
in
iteritems
(
form_class
.
__dict__
):
if
not
name
.
startswith
(
'_'
)
and
isinstance
(
field_object
,
UnboundField
):
# wrap each field in the form from get_form in FieldList
field_dict
[
name
]
=
ListEditableFieldList
(
field_object
)
return
type
(
self
.
model
.
__name__
+
'Form'
,
(
self
.
form_base_class
,
),
field_dict
)
def
scaffold_inline_form_models
(
self
,
form_class
):
"""
Contribute inline models to the form
...
...
@@ -898,6 +922,37 @@ class ModelView(BaseModelView):
return
True
def
update_list_model
(
self
,
form
):
"""
Update model from the list view.
Only supports updating a single field at a time.
:param form:
Form instance
"""
try
:
model
=
self
.
model
()
for
field
in
form
:
# FieldList's last_index will only be set if a field is submitted
# last_index will be the primary key of the updated record
if
getattr
(
field
,
'last_index'
,
None
):
record
=
self
.
session
.
query
(
self
.
model
)
.
get
(
field
.
last_index
)
setattr
(
record
,
field
.
name
,
field
.
data
.
pop
())
self
.
_on_model_change
(
form
,
model
,
False
)
self
.
session
.
commit
()
self
.
after_model_change
(
form
,
model
,
False
)
return
True
except
Exception
as
ex
:
if
not
self
.
handle_view_exception
(
ex
):
log
.
exception
(
gettext
(
'Failed to update record.
%(error)
s'
,
error
=
str
(
ex
)),
'error'
)
self
.
session
.
rollback
()
# Error: Unable to update database or no records were changed.
return
False
def
delete_model
(
self
,
model
):
"""
Delete model.
...
...
flask_admin/model/base.py
View file @
eb37f32c
...
...
@@ -11,7 +11,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
,
is_form_submitted
)
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 +265,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
...
...
@@ -579,6 +590,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 +850,12 @@ class BaseModelView(BaseView, ActionsMixin):
"""
raise
NotImplementedError
(
'Please implement scaffold_form method'
)
def
scaffold_list_form
(
self
):
"""
Create form class for list view in-line editing.
"""
raise
NotImplementedError
(
'Please implement scaffold_list_form method'
)
def
get_form
(
self
):
"""
Get form class.
...
...
@@ -879,6 +902,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 +929,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
...
...
@@ -1074,6 +1114,15 @@ class BaseModelView(BaseView, ActionsMixin):
"""
raise
NotImplementedError
()
def
update_list_model
(
self
,
form
,
model
):
"""
Update model from the list view.
:param form:
Form instance
"""
raise
NotImplementedError
()
def
delete_model
(
self
,
model
):
"""
Delete model.
...
...
@@ -1242,11 +1291,45 @@ class BaseModelView(BaseView, ActionsMixin):
raise
NotImplementedError
()
# Views
@
expose
(
'/'
)
@
expose
(
'/'
,
methods
=
(
'POST'
,
'GET'
)
)
def
index_view
(
self
):
"""
List view
"""
if
self
.
column_editable_list
:
form
=
self
.
list_form
()
# prevent validation issues due to submitting a single field
# delete all fields except the field being submitted
if
is_form_submitted
():
for
field
in
form
:
# only submitted fields have last_index
if
getattr
(
field
,
'last_index'
,
None
):
pass
elif
field
.
name
==
'csrf_token'
:
pass
else
:
form
.
__delitem__
(
field
.
name
)
if
self
.
validate_form
(
form
):
if
self
.
update_list_model
(
form
):
return
gettext
(
'Record was successfully saved.'
)
else
:
# No records changed, or error saving to database.
return
gettext
(
'Failed to update record.
%(error)
s'
,
error
=
''
),
500
if
form
.
errors
:
for
field
in
form
:
for
error
in
field
.
errors
:
# return error to x-editable
if
isinstance
(
error
,
list
):
return
", "
.
join
(
error
),
500
else
:
return
error
,
500
else
:
form
=
None
# Grab parameters from URL
view_args
=
self
.
_get_list_extra_args
()
...
...
@@ -1289,37 +1372,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
):
...
...
flask_admin/model/fields.py
View file @
eb37f32c
...
...
@@ -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,54 @@ 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
class
AjaxSelectField
(
SelectFieldBase
):
"""
Ajax Model Select Field
...
...
flask_admin/model/widgets.py
View file @
eb37f32c
...
...
@@ -61,3 +61,81 @@ 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'
,
'./'
)
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"
,
""
)
# get first entry from FieldList to determine field type
subfield
=
field
.
entries
[
0
]
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
in
[
'QuerySelectField'
,
'ModelSelectField'
]:
kwargs
[
'data-type'
]
=
'select'
# MongoEngine throws an error on blank object names
# this prevents "TypeError: cannot create 'NoneType' instances"
choices
=
{}
for
choice
in
subfield
:
try
:
choices
[
str
(
choice
.
_value
())]
=
str
(
choice
.
label
.
text
)
except
TypeError
:
choices
[
str
(
choice
.
_value
())]
=
""
kwargs
[
'data-source'
]
=
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
[
'DecimalField'
,
'FloatField'
]:
kwargs
[
'data-type'
]
=
'number'
kwargs
[
'data-step'
]
=
'any'
else
:
raise
Exception
(
'Unsupported field type:
%
s'
%
(
type
(
subfield
),))
return
HTMLString
(
'<a
%
s>
%
s</a>'
%
(
html_params
(
**
kwargs
),
value
)
)
flask_admin/static/admin/js/form-1.0.0.js
View file @
eb37f32c
...
...
@@ -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 @
eb37f32c
/*! 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 @
eb37f32c
/*! 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 @
eb37f32c
509 Bytes
flask_admin/static/vendor/x-editable/img/loading.gif
0 → 100644
View file @
eb37f32c
1.81 KB
flask_admin/static/vendor/x-editable/js/bootstrap2-editable-1.5.1.min.js
0 → 100644
View file @
eb37f32c
/*! 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 @
eb37f32c
/*! 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 @
eb37f32c
...
...
@@ -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 @
eb37f32c
...
...
@@ -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 @
eb37f32c
...
...
@@ -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 @
eb37f32c
...
...
@@ -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 @
eb37f32c
...
...
@@ -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,72 @@ 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/'
,
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 errors
obj2
=
Model1
.
objects
.
get
(
test1
=
'datetime_obj1'
)
rv
=
client
.
post
(
'/admin/model1/'
,
data
=
{
'datetime_field-'
+
str
(
obj2
.
id
):
'problematic-input'
,
})
eq_
(
rv
.
status_code
,
500
)
view
=
CustomModelView
(
Model2
,
column_editable_list
=
[
'model1'
])
admin
.
add_view
(
view
)
# Test in-line editing for relations
obj3
=
Model2
.
objects
.
get
(
string_field
=
'string_field_val_1'
)
rv
=
client
.
post
(
'/admin/model2/'
,
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 @
eb37f32c
...
...
@@ -63,25 +63,49 @@ def create_models(db):
class
Model2
(
BaseModel
):
def
__init__
(
self
,
char_field
=
None
,
int_field
=
None
,
float_field
=
None
,
bool_field
=
0
):
bool_field
=
0
,
model1
=
None
):
super
(
Model2
,
self
)
.
__init__
()
self
.
char_field
=
char_field
self
.
int_field
=
int_field
self
.
float_field
=
float_field
self
.
bool_field
=
bool_field
self
.
model1
=
model1
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 +177,63 @@ 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/'
,
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 errors
rv
=
client
.
post
(
'/admin/model1/'
,
data
=
{
'enum_field-1'
:
'problematic-input'
,
})
eq_
(
rv
.
status_code
,
500
)
view
=
CustomModelView
(
Model2
,
column_editable_list
=
[
'model1'
])
admin
.
add_view
(
view
)
# Test in-line editing for relations
rv
=
client
.
post
(
'/admin/model2/'
,
data
=
{
'model1-1'
:
'3'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'Record was successfully saved.'
==
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 @
eb37f32c
...
...
@@ -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,56 @@ 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/'
,
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 errors
rv
=
client
.
post
(
'/admin/model1/'
,
data
=
{
'enum_field-1'
:
'problematic-input'
,
})
eq_
(
rv
.
status_code
,
500
)
view
=
CustomModelView
(
Model2
,
db
.
session
,
column_editable_list
=
[
'model1'
])
admin
.
add_view
(
view
)
# Test in-line editing for relations
rv
=
client
.
post
(
'/admin/model2/'
,
data
=
{
'model1-1'
:
'3'
,
})
data
=
rv
.
data
.
decode
(
'utf-8'
)
ok_
(
'Record was successfully saved.'
==
data
)
def
test_column_filters
():
app
,
db
,
admin
=
setup
()
...
...
@@ -393,37 +476,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