diff --git a/utils/get_error_msg.py b/utils/get_error_msg.py index f678730..eb09d95 100644 --- a/utils/get_error_msg.py +++ b/utils/get_error_msg.py @@ -5,6 +5,7 @@ def get_error_msg(code="20000"): "50403": "Forbidden", "40000": "请求方法错误", "40001": "JSON解析错误", + "45030": "信息不存在", "45032": "邮箱验证码过期", "44031": "邮箱验证码错误", diff --git a/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/PKG-INFO b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/PKG-INFO new file mode 100644 index 0000000..6ceed27 --- /dev/null +++ b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/PKG-INFO @@ -0,0 +1,26 @@ +Metadata-Version: 2.1 +Name: simpleui +Version: 4.0.2 +Summary: django admin theme 后台模板 +Home-page: https://github.com/newpanjing/simpleui +Author: panjing +Author-email: newpanjing@icloud.com +License: Apache License 2.0 +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: Operating System :: OS Independent + +**django-simpleui** + +github: + +https://github.com/newpanjing/django-simpleui + +gitee: + +https://gitee.com/tompeppa/simpleui + + +QQ群: +786576510 + diff --git a/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/SOURCES.txt b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/SOURCES.txt new file mode 100644 index 0000000..d807140 --- /dev/null +++ b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/SOURCES.txt @@ -0,0 +1,604 @@ +MANIFEST.in +README.rst +setup.cfg +setup.py +simpleui/__init__.py +simpleui/apps.py +simpleui/forms.py +simpleui/widgets.py +simpleui.egg-info/PKG-INFO +simpleui.egg-info/SOURCES.txt +simpleui.egg-info/dependency_links.txt +simpleui.egg-info/not-zip-safe +simpleui.egg-info/requires.txt +simpleui.egg-info/top_level.txt +simpleui/__pycache__/__init__.cpython-37.pyc +simpleui/__pycache__/apps.cpython-37.pyc +simpleui/static/admin/css/autocomplete.css +simpleui/static/admin/css/base.css +simpleui/static/admin/css/changelists.css +simpleui/static/admin/css/dashboard.css +simpleui/static/admin/css/fonts.css +simpleui/static/admin/css/forms.css +simpleui/static/admin/css/login.css +simpleui/static/admin/css/responsive.css +simpleui/static/admin/css/responsive_rtl.css +simpleui/static/admin/css/rtl.css +simpleui/static/admin/css/ui.css +simpleui/static/admin/css/widgets.css +simpleui/static/admin/css/vendor/select2/LICENSE-SELECT2.md +simpleui/static/admin/css/vendor/select2/select2.css +simpleui/static/admin/css/vendor/select2/select2.min.css +simpleui/static/admin/fonts/LICENSE.txt +simpleui/static/admin/fonts/README.txt +simpleui/static/admin/fonts/Roboto-Bold-webfont.woff +simpleui/static/admin/fonts/Roboto-Light-webfont.woff +simpleui/static/admin/fonts/Roboto-Regular-webfont.woff +simpleui/static/admin/img/LICENSE +simpleui/static/admin/img/README.txt +simpleui/static/admin/img/calendar-icons.svg +simpleui/static/admin/img/icon-addlink.svg +simpleui/static/admin/img/icon-alert.svg +simpleui/static/admin/img/icon-calendar.svg +simpleui/static/admin/img/icon-changelink.svg +simpleui/static/admin/img/icon-clock.svg +simpleui/static/admin/img/icon-deletelink.svg +simpleui/static/admin/img/icon-no.svg +simpleui/static/admin/img/icon-unknown-alt.svg +simpleui/static/admin/img/icon-unknown.svg +simpleui/static/admin/img/icon-yes.svg +simpleui/static/admin/img/inline-delete.svg +simpleui/static/admin/img/search.svg +simpleui/static/admin/img/selector-icons.svg +simpleui/static/admin/img/sorting-icons.svg +simpleui/static/admin/img/tooltag-add.svg +simpleui/static/admin/img/tooltag-arrowright.svg +simpleui/static/admin/img/gis/move_vertex_off.svg +simpleui/static/admin/img/gis/move_vertex_on.svg +simpleui/static/admin/js/SelectBox.js +simpleui/static/admin/js/SelectFilter2.js +simpleui/static/admin/js/actions.js +simpleui/static/admin/js/actions.min.js +simpleui/static/admin/js/autocomplete.js +simpleui/static/admin/js/calendar.js +simpleui/static/admin/js/cancel.js +simpleui/static/admin/js/change_form.js +simpleui/static/admin/js/collapse.js +simpleui/static/admin/js/collapse.min.js +simpleui/static/admin/js/core.js +simpleui/static/admin/js/inlines.js +simpleui/static/admin/js/inlines.min.js +simpleui/static/admin/js/jquery.init.js +simpleui/static/admin/js/popup_response.js +simpleui/static/admin/js/prepopulate.js +simpleui/static/admin/js/prepopulate.min.js +simpleui/static/admin/js/prepopulate_init.js +simpleui/static/admin/js/timeparse.js +simpleui/static/admin/js/urlify.js +simpleui/static/admin/js/admin/DateTimeShortcuts.js +simpleui/static/admin/js/admin/RelatedObjectLookups.js +simpleui/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt +simpleui/static/admin/js/vendor/jquery/jquery.js +simpleui/static/admin/js/vendor/jquery/jquery.min.js +simpleui/static/admin/js/vendor/select2/LICENSE-SELECT2.md +simpleui/static/admin/js/vendor/select2/select2.full.js +simpleui/static/admin/js/vendor/select2/select2.full.min.js +simpleui/static/admin/js/vendor/select2/i18n/ar.js +simpleui/static/admin/js/vendor/select2/i18n/az.js +simpleui/static/admin/js/vendor/select2/i18n/bg.js +simpleui/static/admin/js/vendor/select2/i18n/ca.js +simpleui/static/admin/js/vendor/select2/i18n/cs.js +simpleui/static/admin/js/vendor/select2/i18n/da.js +simpleui/static/admin/js/vendor/select2/i18n/de.js +simpleui/static/admin/js/vendor/select2/i18n/el.js +simpleui/static/admin/js/vendor/select2/i18n/en.js +simpleui/static/admin/js/vendor/select2/i18n/es.js +simpleui/static/admin/js/vendor/select2/i18n/et.js +simpleui/static/admin/js/vendor/select2/i18n/eu.js +simpleui/static/admin/js/vendor/select2/i18n/fa.js +simpleui/static/admin/js/vendor/select2/i18n/fi.js +simpleui/static/admin/js/vendor/select2/i18n/fr.js +simpleui/static/admin/js/vendor/select2/i18n/gl.js +simpleui/static/admin/js/vendor/select2/i18n/he.js +simpleui/static/admin/js/vendor/select2/i18n/hi.js +simpleui/static/admin/js/vendor/select2/i18n/hr.js +simpleui/static/admin/js/vendor/select2/i18n/hu.js +simpleui/static/admin/js/vendor/select2/i18n/id.js +simpleui/static/admin/js/vendor/select2/i18n/is.js +simpleui/static/admin/js/vendor/select2/i18n/it.js +simpleui/static/admin/js/vendor/select2/i18n/ja.js +simpleui/static/admin/js/vendor/select2/i18n/km.js +simpleui/static/admin/js/vendor/select2/i18n/ko.js +simpleui/static/admin/js/vendor/select2/i18n/lt.js +simpleui/static/admin/js/vendor/select2/i18n/lv.js +simpleui/static/admin/js/vendor/select2/i18n/mk.js +simpleui/static/admin/js/vendor/select2/i18n/ms.js +simpleui/static/admin/js/vendor/select2/i18n/nb.js +simpleui/static/admin/js/vendor/select2/i18n/nl.js +simpleui/static/admin/js/vendor/select2/i18n/pl.js +simpleui/static/admin/js/vendor/select2/i18n/pt-BR.js +simpleui/static/admin/js/vendor/select2/i18n/pt.js +simpleui/static/admin/js/vendor/select2/i18n/ro.js +simpleui/static/admin/js/vendor/select2/i18n/ru.js +simpleui/static/admin/js/vendor/select2/i18n/sk.js +simpleui/static/admin/js/vendor/select2/i18n/sr-Cyrl.js +simpleui/static/admin/js/vendor/select2/i18n/sr.js +simpleui/static/admin/js/vendor/select2/i18n/sv.js +simpleui/static/admin/js/vendor/select2/i18n/th.js +simpleui/static/admin/js/vendor/select2/i18n/tr.js +simpleui/static/admin/js/vendor/select2/i18n/uk.js +simpleui/static/admin/js/vendor/select2/i18n/vi.js +simpleui/static/admin/js/vendor/select2/i18n/zh-CN.js +simpleui/static/admin/js/vendor/select2/i18n/zh-TW.js +simpleui/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt +simpleui/static/admin/js/vendor/xregexp/xregexp.js +simpleui/static/admin/js/vendor/xregexp/xregexp.min.js +simpleui/static/admin/simpleui-x/automatic/dicts.js +simpleui/static/admin/simpleui-x/automatic/segment.js +simpleui/static/admin/simpleui-x/css/base.css +simpleui/static/admin/simpleui-x/css/base.css.map +simpleui/static/admin/simpleui-x/css/base.less +simpleui/static/admin/simpleui-x/css/index.css +simpleui/static/admin/simpleui-x/css/index.css.map +simpleui/static/admin/simpleui-x/css/index.less +simpleui/static/admin/simpleui-x/css/login.css +simpleui/static/admin/simpleui-x/elementui/alert.js +simpleui/static/admin/simpleui-x/elementui/aside.js +simpleui/static/admin/simpleui-x/elementui/autocomplete.js +simpleui/static/admin/simpleui-x/elementui/avatar.js +simpleui/static/admin/simpleui-x/elementui/backtop.js +simpleui/static/admin/simpleui-x/elementui/badge.js +simpleui/static/admin/simpleui-x/elementui/breadcrumb-item.js +simpleui/static/admin/simpleui-x/elementui/breadcrumb.js +simpleui/static/admin/simpleui-x/elementui/button-group.js +simpleui/static/admin/simpleui-x/elementui/button.js +simpleui/static/admin/simpleui-x/elementui/calendar.js +simpleui/static/admin/simpleui-x/elementui/card.js +simpleui/static/admin/simpleui-x/elementui/carousel-item.js +simpleui/static/admin/simpleui-x/elementui/carousel.js +simpleui/static/admin/simpleui-x/elementui/cascader-panel.js +simpleui/static/admin/simpleui-x/elementui/cascader.js +simpleui/static/admin/simpleui-x/elementui/checkbox-button.js +simpleui/static/admin/simpleui-x/elementui/checkbox-group.js +simpleui/static/admin/simpleui-x/elementui/checkbox.js +simpleui/static/admin/simpleui-x/elementui/col.js +simpleui/static/admin/simpleui-x/elementui/collapse-item.js +simpleui/static/admin/simpleui-x/elementui/collapse.js +simpleui/static/admin/simpleui-x/elementui/color-picker.js +simpleui/static/admin/simpleui-x/elementui/container.js +simpleui/static/admin/simpleui-x/elementui/date-picker.js +simpleui/static/admin/simpleui-x/elementui/dialog.js +simpleui/static/admin/simpleui-x/elementui/divider.js +simpleui/static/admin/simpleui-x/elementui/drawer.js +simpleui/static/admin/simpleui-x/elementui/dropdown-item.js +simpleui/static/admin/simpleui-x/elementui/dropdown-menu.js +simpleui/static/admin/simpleui-x/elementui/dropdown.js +simpleui/static/admin/simpleui-x/elementui/element-ui.common.js +simpleui/static/admin/simpleui-x/elementui/footer.js +simpleui/static/admin/simpleui-x/elementui/form-item.js +simpleui/static/admin/simpleui-x/elementui/form.js +simpleui/static/admin/simpleui-x/elementui/header.js +simpleui/static/admin/simpleui-x/elementui/icon.js +simpleui/static/admin/simpleui-x/elementui/image.js +simpleui/static/admin/simpleui-x/elementui/index.js +simpleui/static/admin/simpleui-x/elementui/infinite-scroll.js +simpleui/static/admin/simpleui-x/elementui/input-number.js +simpleui/static/admin/simpleui-x/elementui/input.js +simpleui/static/admin/simpleui-x/elementui/link.js +simpleui/static/admin/simpleui-x/elementui/loading.js +simpleui/static/admin/simpleui-x/elementui/main.js +simpleui/static/admin/simpleui-x/elementui/menu-item-group.js +simpleui/static/admin/simpleui-x/elementui/menu-item.js +simpleui/static/admin/simpleui-x/elementui/menu.js +simpleui/static/admin/simpleui-x/elementui/message-box.js +simpleui/static/admin/simpleui-x/elementui/message.js +simpleui/static/admin/simpleui-x/elementui/notification.js +simpleui/static/admin/simpleui-x/elementui/option-group.js +simpleui/static/admin/simpleui-x/elementui/option.js +simpleui/static/admin/simpleui-x/elementui/page-header.js +simpleui/static/admin/simpleui-x/elementui/pagination.js +simpleui/static/admin/simpleui-x/elementui/popover.js +simpleui/static/admin/simpleui-x/elementui/progress.js +simpleui/static/admin/simpleui-x/elementui/radio-button.js +simpleui/static/admin/simpleui-x/elementui/radio-group.js +simpleui/static/admin/simpleui-x/elementui/radio.js +simpleui/static/admin/simpleui-x/elementui/rate.js +simpleui/static/admin/simpleui-x/elementui/row.js +simpleui/static/admin/simpleui-x/elementui/scrollbar.js +simpleui/static/admin/simpleui-x/elementui/select.js +simpleui/static/admin/simpleui-x/elementui/slider.js +simpleui/static/admin/simpleui-x/elementui/spinner.js +simpleui/static/admin/simpleui-x/elementui/step.js +simpleui/static/admin/simpleui-x/elementui/steps.js +simpleui/static/admin/simpleui-x/elementui/submenu.js +simpleui/static/admin/simpleui-x/elementui/switch.js +simpleui/static/admin/simpleui-x/elementui/tab-pane.js +simpleui/static/admin/simpleui-x/elementui/table-column.js +simpleui/static/admin/simpleui-x/elementui/table.js +simpleui/static/admin/simpleui-x/elementui/tabs.js +simpleui/static/admin/simpleui-x/elementui/tag.js +simpleui/static/admin/simpleui-x/elementui/time-picker.js +simpleui/static/admin/simpleui-x/elementui/time-select.js +simpleui/static/admin/simpleui-x/elementui/timeline-item.js +simpleui/static/admin/simpleui-x/elementui/timeline.js +simpleui/static/admin/simpleui-x/elementui/tooltip.js +simpleui/static/admin/simpleui-x/elementui/transfer.js +simpleui/static/admin/simpleui-x/elementui/tree.js +simpleui/static/admin/simpleui-x/elementui/upload.js +simpleui/static/admin/simpleui-x/elementui/directives/mousewheel.js +simpleui/static/admin/simpleui-x/elementui/directives/repeat-click.js +simpleui/static/admin/simpleui-x/elementui/locale/format.js +simpleui/static/admin/simpleui-x/elementui/locale/index.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/af-ZA.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ar.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/bg.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ca.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/cs-CZ.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/da.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/de.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ee.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/el.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/en.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/es.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/eu.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/fa.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/fi.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/fr.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/he.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/hr.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/hu.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/hy-AM.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/id.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/it.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ja.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/kg.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/km.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ko.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ku.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/kz.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/lt.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/lv.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/mn.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/nb-NO.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/nl.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/pl.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/pt-br.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/pt.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ro.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ru-RU.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/sk.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/sl.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/sr.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/sv-SE.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ta.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/th.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/tk.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/tr-TR.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ua.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/ug-CN.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/uz-UZ.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/vi.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/zh-CN.js +simpleui/static/admin/simpleui-x/elementui/locale/lang/zh-TW.js +simpleui/static/admin/simpleui-x/elementui/mixins/emitter.js +simpleui/static/admin/simpleui-x/elementui/mixins/focus.js +simpleui/static/admin/simpleui-x/elementui/mixins/locale.js +simpleui/static/admin/simpleui-x/elementui/mixins/migrating.js +simpleui/static/admin/simpleui-x/elementui/theme-chalk/alert.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/aside.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/autocomplete.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/avatar.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/backtop.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/badge.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/base.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/breadcrumb-item.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/breadcrumb.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/button-group.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/button.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/calendar.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/card.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/carousel-item.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/carousel.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/cascader-panel.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/cascader.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/checkbox-button.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/checkbox-group.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/checkbox.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/col.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/collapse-item.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/collapse.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/color-picker.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/container.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/date-picker.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/dialog.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/display.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/divider.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/drawer.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/dropdown-item.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/dropdown-menu.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/dropdown.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/footer.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/form-item.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/form.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/header.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/icon.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/image.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/index.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/infinite-scroll.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/infiniteScroll.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/input-number.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/input.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/link.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/loading.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/main.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/menu-item-group.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/menu-item.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/menu.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/message-box.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/message.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/notification.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/option-group.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/option.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/page-header.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/pagination.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/popover.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/popper.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/progress.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/radio-button.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/radio-group.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/radio.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/rate.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/reset.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/row.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/scrollbar.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/select-dropdown.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/select.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/slider.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/spinner.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/step.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/steps.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/submenu.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/switch.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/tab-pane.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/table-column.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/table.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/tabs.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/tag.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/time-picker.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/time-select.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/timeline-item.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/timeline.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/tooltip.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/transfer.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/tree.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/upload.css +simpleui/static/admin/simpleui-x/elementui/theme-chalk/fonts/element-icons.ttf +simpleui/static/admin/simpleui-x/elementui/theme-chalk/fonts/element-icons.woff +simpleui/static/admin/simpleui-x/elementui/transitions/collapse-transition.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/af-ZA.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ar.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/bg.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ca.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/cs-CZ.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/da.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/de.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ee.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/el.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/en.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/es.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/eu.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/fa.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/fi.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/fr.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/he.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/hr.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/hu.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/hy-AM.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/id.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/it.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ja.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/kg.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/km.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ko.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ku.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/kz.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/lt.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/lv.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/mn.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/nb-NO.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/nl.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/pl.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/pt-br.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/pt.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ro.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ru-RU.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/sk.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/sl.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/sr.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/sv-SE.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ta.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/th.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/tk.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/tr-TR.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ua.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/ug-CN.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/uz-UZ.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/vi.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/zh-CN.js +simpleui/static/admin/simpleui-x/elementui/umd/locale/zh-TW.js +simpleui/static/admin/simpleui-x/elementui/utils/after-leave.js +simpleui/static/admin/simpleui-x/elementui/utils/aria-dialog.js +simpleui/static/admin/simpleui-x/elementui/utils/aria-utils.js +simpleui/static/admin/simpleui-x/elementui/utils/clickoutside.js +simpleui/static/admin/simpleui-x/elementui/utils/date-util.js +simpleui/static/admin/simpleui-x/elementui/utils/date.js +simpleui/static/admin/simpleui-x/elementui/utils/dom.js +simpleui/static/admin/simpleui-x/elementui/utils/merge.js +simpleui/static/admin/simpleui-x/elementui/utils/popper.js +simpleui/static/admin/simpleui-x/elementui/utils/resize-event.js +simpleui/static/admin/simpleui-x/elementui/utils/scroll-into-view.js +simpleui/static/admin/simpleui-x/elementui/utils/scrollbar-width.js +simpleui/static/admin/simpleui-x/elementui/utils/shared.js +simpleui/static/admin/simpleui-x/elementui/utils/types.js +simpleui/static/admin/simpleui-x/elementui/utils/util.js +simpleui/static/admin/simpleui-x/elementui/utils/vdom.js +simpleui/static/admin/simpleui-x/elementui/utils/vue-popper.js +simpleui/static/admin/simpleui-x/elementui/utils/menu/aria-menubar.js +simpleui/static/admin/simpleui-x/elementui/utils/menu/aria-menuitem.js +simpleui/static/admin/simpleui-x/elementui/utils/menu/aria-submenu.js +simpleui/static/admin/simpleui-x/elementui/utils/popup/index.js +simpleui/static/admin/simpleui-x/elementui/utils/popup/popup-manager.js +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/css/all.min.css +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.eot +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.svg +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.ttf +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.woff +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-brands-400.woff2 +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.eot +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.svg +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.ttf +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.woff +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-regular-400.woff2 +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.eot +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.svg +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.ttf +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.woff +simpleui/static/admin/simpleui-x/fontawesome-free-5.8.1-web/webfonts/fa-solid-900.woff2 +simpleui/static/admin/simpleui-x/img/bg.svg +simpleui/static/admin/simpleui-x/img/favicon.png +simpleui/static/admin/simpleui-x/img/logo.png +simpleui/static/admin/simpleui-x/js/cookie.js +simpleui/static/admin/simpleui-x/js/index.js +simpleui/static/admin/simpleui-x/js/language.js +simpleui/static/admin/simpleui-x/js/login.js +simpleui/static/admin/simpleui-x/js/vue.min.js +simpleui/static/admin/simpleui-x/locale/en-us.js +simpleui/static/admin/simpleui-x/locale/zh-hans.js +simpleui/static/admin/simpleui-x/particles/app.js +simpleui/static/admin/simpleui-x/particles/particles.js +simpleui/static/admin/simpleui-x/theme/admin.lte.css +simpleui/static/admin/simpleui-x/theme/admin.lte.css.map +simpleui/static/admin/simpleui-x/theme/admin.lte.less +simpleui/static/admin/simpleui-x/theme/aircraft.css +simpleui/static/admin/simpleui-x/theme/aircraft.css.map +simpleui/static/admin/simpleui-x/theme/aircraft.less +simpleui/static/admin/simpleui-x/theme/ant.design.css +simpleui/static/admin/simpleui-x/theme/ant.design.css.map +simpleui/static/admin/simpleui-x/theme/ant.design.less +simpleui/static/admin/simpleui-x/theme/base.less +simpleui/static/admin/simpleui-x/theme/black.css +simpleui/static/admin/simpleui-x/theme/black.css.map +simpleui/static/admin/simpleui-x/theme/black.less +simpleui/static/admin/simpleui-x/theme/dark.green.css +simpleui/static/admin/simpleui-x/theme/dark.green.css.map +simpleui/static/admin/simpleui-x/theme/dark.green.less +simpleui/static/admin/simpleui-x/theme/e-black-pro.css +simpleui/static/admin/simpleui-x/theme/e-black-pro.css.map +simpleui/static/admin/simpleui-x/theme/e-black-pro.less +simpleui/static/admin/simpleui-x/theme/e-black.css +simpleui/static/admin/simpleui-x/theme/e-black.css.map +simpleui/static/admin/simpleui-x/theme/e-black.less +simpleui/static/admin/simpleui-x/theme/e-blue-pro.css +simpleui/static/admin/simpleui-x/theme/e-blue-pro.css.map +simpleui/static/admin/simpleui-x/theme/e-blue-pro.less +simpleui/static/admin/simpleui-x/theme/e-blue.css +simpleui/static/admin/simpleui-x/theme/e-blue.css.map +simpleui/static/admin/simpleui-x/theme/e-blue.less +simpleui/static/admin/simpleui-x/theme/e-green-pro.css +simpleui/static/admin/simpleui-x/theme/e-green-pro.css.map +simpleui/static/admin/simpleui-x/theme/e-green-pro.less +simpleui/static/admin/simpleui-x/theme/e-green.css +simpleui/static/admin/simpleui-x/theme/e-green.css.map +simpleui/static/admin/simpleui-x/theme/e-green.less +simpleui/static/admin/simpleui-x/theme/e-purple-pro.css +simpleui/static/admin/simpleui-x/theme/e-purple-pro.css.map +simpleui/static/admin/simpleui-x/theme/e-purple-pro.less +simpleui/static/admin/simpleui-x/theme/e-purple.css +simpleui/static/admin/simpleui-x/theme/e-purple.css.map +simpleui/static/admin/simpleui-x/theme/e-purple.less +simpleui/static/admin/simpleui-x/theme/e-red-pro.css +simpleui/static/admin/simpleui-x/theme/e-red-pro.css.map +simpleui/static/admin/simpleui-x/theme/e-red-pro.less +simpleui/static/admin/simpleui-x/theme/e-red.css +simpleui/static/admin/simpleui-x/theme/e-red.css.map +simpleui/static/admin/simpleui-x/theme/e-red.less +simpleui/static/admin/simpleui-x/theme/element.css +simpleui/static/admin/simpleui-x/theme/element.css.map +simpleui/static/admin/simpleui-x/theme/element.less +simpleui/static/admin/simpleui-x/theme/gray.css +simpleui/static/admin/simpleui-x/theme/gray.css.map +simpleui/static/admin/simpleui-x/theme/gray.less +simpleui/static/admin/simpleui-x/theme/green.css +simpleui/static/admin/simpleui-x/theme/green.css.map +simpleui/static/admin/simpleui-x/theme/green.less +simpleui/static/admin/simpleui-x/theme/highdmin.css +simpleui/static/admin/simpleui-x/theme/highdmin.css.map +simpleui/static/admin/simpleui-x/theme/highdmin.less +simpleui/static/admin/simpleui-x/theme/layui.css +simpleui/static/admin/simpleui-x/theme/layui.css.map +simpleui/static/admin/simpleui-x/theme/layui.less +simpleui/static/admin/simpleui-x/theme/light.css +simpleui/static/admin/simpleui-x/theme/light.css.map +simpleui/static/admin/simpleui-x/theme/light.less +simpleui/static/admin/simpleui-x/theme/orange.css +simpleui/static/admin/simpleui-x/theme/orange.css.map +simpleui/static/admin/simpleui-x/theme/orange.less +simpleui/static/admin/simpleui-x/theme/purple.css +simpleui/static/admin/simpleui-x/theme/purple.css.map +simpleui/static/admin/simpleui-x/theme/purple.less +simpleui/static/admin/simpleui-x/theme/simpleui.css +simpleui/static/admin/simpleui-x/theme/simpleui.css.map +simpleui/static/admin/simpleui-x/theme/simpleui.less +simpleui/static/admin/simpleui-x/theme/theme.js +simpleui/static/admin/simpleui-x/theme/x-blue.css +simpleui/static/admin/simpleui-x/theme/x-blue.css.map +simpleui/static/admin/simpleui-x/theme/x-blue.less +simpleui/static/admin/simpleui-x/theme/x-green.css +simpleui/static/admin/simpleui-x/theme/x-green.css.map +simpleui/static/admin/simpleui-x/theme/x-green.less +simpleui/static/admin/simpleui-x/theme/x-red.css +simpleui/static/admin/simpleui-x/theme/x-red.css.map +simpleui/static/admin/simpleui-x/theme/x-red.less +simpleui/static/admin/simpleui-x/waves/waves.min.css +simpleui/static/admin/simpleui-x/waves/waves.min.js +simpleui/static/admin/simpleui-x/waves/waves.min.js.map +simpleui/static/import_export/action_formats.js +simpleui/templates/admin/404.html +simpleui/templates/admin/500.html +simpleui/templates/admin/actions.html +simpleui/templates/admin/app_index.html +simpleui/templates/admin/base.html +simpleui/templates/admin/base_site.html +simpleui/templates/admin/change_form.html +simpleui/templates/admin/change_form_object_tools.html +simpleui/templates/admin/change_list.html +simpleui/templates/admin/change_list_object_tools.html +simpleui/templates/admin/change_list_results.html +simpleui/templates/admin/date_hierarchy.html +simpleui/templates/admin/filter.html +simpleui/templates/admin/home.html +simpleui/templates/admin/index.html +simpleui/templates/admin/invalid_setup.html +simpleui/templates/admin/login.html +simpleui/templates/admin/object_history.html +simpleui/templates/admin/pagination.html +simpleui/templates/admin/popup_response.html +simpleui/templates/admin/prepopulated_fields_js.html +simpleui/templates/admin/related_widget_wrapper.html +simpleui/templates/admin/search_form.html +simpleui/templates/admin/submit_line.html +simpleui/templates/admin/includes/css-part.html +simpleui/templates/admin/includes/fieldset.html +simpleui/templates/admin/includes/js-part.html +simpleui/templates/registration/logged_out.html +simpleui/templates/registration/password_change_done.html +simpleui/templates/registration/password_change_form.html +simpleui/templates/registration/password_reset_complete.html +simpleui/templates/registration/password_reset_confirm.html +simpleui/templates/registration/password_reset_done.html +simpleui/templates/registration/password_reset_email.html +simpleui/templates/registration/password_reset_form.html +simpleui/templatetags/__init__.py +simpleui/templatetags/simpletags.py +simpleui/templatetags/__pycache__/__init__.cpython-37.pyc +simpleui/templatetags/__pycache__/simpletags.cpython-37.pyc \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/dependency_links.txt b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/installed-files.txt b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/installed-files.txt new file mode 100644 index 0000000..b4cf8ef --- /dev/null +++ b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/installed-files.txt @@ -0,0 +1,606 @@ +..\simpleui\__init__.py +..\simpleui\__pycache__\__init__.cpython-37.pyc +..\simpleui\__pycache__\__init__.cpython-39.pyc +..\simpleui\__pycache__\apps.cpython-37.pyc +..\simpleui\__pycache__\apps.cpython-39.pyc +..\simpleui\__pycache__\forms.cpython-39.pyc +..\simpleui\__pycache__\widgets.cpython-39.pyc +..\simpleui\apps.py +..\simpleui\forms.py +..\simpleui\static\admin\css\autocomplete.css +..\simpleui\static\admin\css\base.css +..\simpleui\static\admin\css\changelists.css +..\simpleui\static\admin\css\dashboard.css +..\simpleui\static\admin\css\fonts.css +..\simpleui\static\admin\css\forms.css +..\simpleui\static\admin\css\login.css +..\simpleui\static\admin\css\responsive.css +..\simpleui\static\admin\css\responsive_rtl.css +..\simpleui\static\admin\css\rtl.css +..\simpleui\static\admin\css\ui.css +..\simpleui\static\admin\css\vendor\select2\LICENSE-SELECT2.md +..\simpleui\static\admin\css\vendor\select2\select2.css +..\simpleui\static\admin\css\vendor\select2\select2.min.css +..\simpleui\static\admin\css\widgets.css +..\simpleui\static\admin\fonts\LICENSE.txt +..\simpleui\static\admin\fonts\README.txt +..\simpleui\static\admin\fonts\Roboto-Bold-webfont.woff +..\simpleui\static\admin\fonts\Roboto-Light-webfont.woff +..\simpleui\static\admin\fonts\Roboto-Regular-webfont.woff +..\simpleui\static\admin\img\LICENSE +..\simpleui\static\admin\img\README.txt +..\simpleui\static\admin\img\calendar-icons.svg +..\simpleui\static\admin\img\gis\move_vertex_off.svg +..\simpleui\static\admin\img\gis\move_vertex_on.svg +..\simpleui\static\admin\img\icon-addlink.svg +..\simpleui\static\admin\img\icon-alert.svg +..\simpleui\static\admin\img\icon-calendar.svg +..\simpleui\static\admin\img\icon-changelink.svg +..\simpleui\static\admin\img\icon-clock.svg +..\simpleui\static\admin\img\icon-deletelink.svg +..\simpleui\static\admin\img\icon-no.svg +..\simpleui\static\admin\img\icon-unknown-alt.svg +..\simpleui\static\admin\img\icon-unknown.svg +..\simpleui\static\admin\img\icon-yes.svg +..\simpleui\static\admin\img\inline-delete.svg +..\simpleui\static\admin\img\search.svg +..\simpleui\static\admin\img\selector-icons.svg +..\simpleui\static\admin\img\sorting-icons.svg +..\simpleui\static\admin\img\tooltag-add.svg +..\simpleui\static\admin\img\tooltag-arrowright.svg +..\simpleui\static\admin\js\SelectBox.js +..\simpleui\static\admin\js\SelectFilter2.js +..\simpleui\static\admin\js\actions.js +..\simpleui\static\admin\js\actions.min.js +..\simpleui\static\admin\js\admin\DateTimeShortcuts.js +..\simpleui\static\admin\js\admin\RelatedObjectLookups.js +..\simpleui\static\admin\js\autocomplete.js +..\simpleui\static\admin\js\calendar.js +..\simpleui\static\admin\js\cancel.js +..\simpleui\static\admin\js\change_form.js +..\simpleui\static\admin\js\collapse.js +..\simpleui\static\admin\js\collapse.min.js +..\simpleui\static\admin\js\core.js +..\simpleui\static\admin\js\inlines.js +..\simpleui\static\admin\js\inlines.min.js +..\simpleui\static\admin\js\jquery.init.js +..\simpleui\static\admin\js\popup_response.js +..\simpleui\static\admin\js\prepopulate.js +..\simpleui\static\admin\js\prepopulate.min.js +..\simpleui\static\admin\js\prepopulate_init.js +..\simpleui\static\admin\js\timeparse.js +..\simpleui\static\admin\js\urlify.js +..\simpleui\static\admin\js\vendor\jquery\LICENSE-JQUERY.txt +..\simpleui\static\admin\js\vendor\jquery\jquery.js +..\simpleui\static\admin\js\vendor\jquery\jquery.min.js +..\simpleui\static\admin\js\vendor\select2\LICENSE-SELECT2.md +..\simpleui\static\admin\js\vendor\select2\i18n\ar.js +..\simpleui\static\admin\js\vendor\select2\i18n\az.js +..\simpleui\static\admin\js\vendor\select2\i18n\bg.js +..\simpleui\static\admin\js\vendor\select2\i18n\ca.js +..\simpleui\static\admin\js\vendor\select2\i18n\cs.js +..\simpleui\static\admin\js\vendor\select2\i18n\da.js +..\simpleui\static\admin\js\vendor\select2\i18n\de.js +..\simpleui\static\admin\js\vendor\select2\i18n\el.js +..\simpleui\static\admin\js\vendor\select2\i18n\en.js +..\simpleui\static\admin\js\vendor\select2\i18n\es.js +..\simpleui\static\admin\js\vendor\select2\i18n\et.js +..\simpleui\static\admin\js\vendor\select2\i18n\eu.js +..\simpleui\static\admin\js\vendor\select2\i18n\fa.js +..\simpleui\static\admin\js\vendor\select2\i18n\fi.js +..\simpleui\static\admin\js\vendor\select2\i18n\fr.js +..\simpleui\static\admin\js\vendor\select2\i18n\gl.js +..\simpleui\static\admin\js\vendor\select2\i18n\he.js +..\simpleui\static\admin\js\vendor\select2\i18n\hi.js +..\simpleui\static\admin\js\vendor\select2\i18n\hr.js +..\simpleui\static\admin\js\vendor\select2\i18n\hu.js +..\simpleui\static\admin\js\vendor\select2\i18n\id.js +..\simpleui\static\admin\js\vendor\select2\i18n\is.js +..\simpleui\static\admin\js\vendor\select2\i18n\it.js +..\simpleui\static\admin\js\vendor\select2\i18n\ja.js +..\simpleui\static\admin\js\vendor\select2\i18n\km.js +..\simpleui\static\admin\js\vendor\select2\i18n\ko.js +..\simpleui\static\admin\js\vendor\select2\i18n\lt.js +..\simpleui\static\admin\js\vendor\select2\i18n\lv.js +..\simpleui\static\admin\js\vendor\select2\i18n\mk.js +..\simpleui\static\admin\js\vendor\select2\i18n\ms.js +..\simpleui\static\admin\js\vendor\select2\i18n\nb.js +..\simpleui\static\admin\js\vendor\select2\i18n\nl.js +..\simpleui\static\admin\js\vendor\select2\i18n\pl.js +..\simpleui\static\admin\js\vendor\select2\i18n\pt-BR.js +..\simpleui\static\admin\js\vendor\select2\i18n\pt.js +..\simpleui\static\admin\js\vendor\select2\i18n\ro.js +..\simpleui\static\admin\js\vendor\select2\i18n\ru.js +..\simpleui\static\admin\js\vendor\select2\i18n\sk.js +..\simpleui\static\admin\js\vendor\select2\i18n\sr-Cyrl.js +..\simpleui\static\admin\js\vendor\select2\i18n\sr.js +..\simpleui\static\admin\js\vendor\select2\i18n\sv.js +..\simpleui\static\admin\js\vendor\select2\i18n\th.js +..\simpleui\static\admin\js\vendor\select2\i18n\tr.js +..\simpleui\static\admin\js\vendor\select2\i18n\uk.js +..\simpleui\static\admin\js\vendor\select2\i18n\vi.js +..\simpleui\static\admin\js\vendor\select2\i18n\zh-CN.js +..\simpleui\static\admin\js\vendor\select2\i18n\zh-TW.js +..\simpleui\static\admin\js\vendor\select2\select2.full.js +..\simpleui\static\admin\js\vendor\select2\select2.full.min.js +..\simpleui\static\admin\js\vendor\xregexp\LICENSE-XREGEXP.txt +..\simpleui\static\admin\js\vendor\xregexp\xregexp.js +..\simpleui\static\admin\js\vendor\xregexp\xregexp.min.js +..\simpleui\static\admin\simpleui-x\automatic\dicts.js +..\simpleui\static\admin\simpleui-x\automatic\segment.js +..\simpleui\static\admin\simpleui-x\css\base.css +..\simpleui\static\admin\simpleui-x\css\base.css.map +..\simpleui\static\admin\simpleui-x\css\base.less +..\simpleui\static\admin\simpleui-x\css\index.css +..\simpleui\static\admin\simpleui-x\css\index.css.map +..\simpleui\static\admin\simpleui-x\css\index.less +..\simpleui\static\admin\simpleui-x\css\login.css +..\simpleui\static\admin\simpleui-x\elementui\alert.js +..\simpleui\static\admin\simpleui-x\elementui\aside.js +..\simpleui\static\admin\simpleui-x\elementui\autocomplete.js +..\simpleui\static\admin\simpleui-x\elementui\avatar.js +..\simpleui\static\admin\simpleui-x\elementui\backtop.js +..\simpleui\static\admin\simpleui-x\elementui\badge.js +..\simpleui\static\admin\simpleui-x\elementui\breadcrumb-item.js +..\simpleui\static\admin\simpleui-x\elementui\breadcrumb.js +..\simpleui\static\admin\simpleui-x\elementui\button-group.js +..\simpleui\static\admin\simpleui-x\elementui\button.js +..\simpleui\static\admin\simpleui-x\elementui\calendar.js +..\simpleui\static\admin\simpleui-x\elementui\card.js +..\simpleui\static\admin\simpleui-x\elementui\carousel-item.js +..\simpleui\static\admin\simpleui-x\elementui\carousel.js +..\simpleui\static\admin\simpleui-x\elementui\cascader-panel.js +..\simpleui\static\admin\simpleui-x\elementui\cascader.js +..\simpleui\static\admin\simpleui-x\elementui\checkbox-button.js +..\simpleui\static\admin\simpleui-x\elementui\checkbox-group.js +..\simpleui\static\admin\simpleui-x\elementui\checkbox.js +..\simpleui\static\admin\simpleui-x\elementui\col.js +..\simpleui\static\admin\simpleui-x\elementui\collapse-item.js +..\simpleui\static\admin\simpleui-x\elementui\collapse.js +..\simpleui\static\admin\simpleui-x\elementui\color-picker.js +..\simpleui\static\admin\simpleui-x\elementui\container.js +..\simpleui\static\admin\simpleui-x\elementui\date-picker.js +..\simpleui\static\admin\simpleui-x\elementui\dialog.js +..\simpleui\static\admin\simpleui-x\elementui\directives\mousewheel.js +..\simpleui\static\admin\simpleui-x\elementui\directives\repeat-click.js +..\simpleui\static\admin\simpleui-x\elementui\divider.js +..\simpleui\static\admin\simpleui-x\elementui\drawer.js +..\simpleui\static\admin\simpleui-x\elementui\dropdown-item.js +..\simpleui\static\admin\simpleui-x\elementui\dropdown-menu.js +..\simpleui\static\admin\simpleui-x\elementui\dropdown.js +..\simpleui\static\admin\simpleui-x\elementui\element-ui.common.js +..\simpleui\static\admin\simpleui-x\elementui\footer.js +..\simpleui\static\admin\simpleui-x\elementui\form-item.js +..\simpleui\static\admin\simpleui-x\elementui\form.js +..\simpleui\static\admin\simpleui-x\elementui\header.js +..\simpleui\static\admin\simpleui-x\elementui\icon.js +..\simpleui\static\admin\simpleui-x\elementui\image.js +..\simpleui\static\admin\simpleui-x\elementui\index.js +..\simpleui\static\admin\simpleui-x\elementui\infinite-scroll.js +..\simpleui\static\admin\simpleui-x\elementui\input-number.js +..\simpleui\static\admin\simpleui-x\elementui\input.js +..\simpleui\static\admin\simpleui-x\elementui\link.js +..\simpleui\static\admin\simpleui-x\elementui\loading.js +..\simpleui\static\admin\simpleui-x\elementui\locale\format.js +..\simpleui\static\admin\simpleui-x\elementui\locale\index.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\af-ZA.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ar.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\bg.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ca.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\cs-CZ.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\da.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\de.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ee.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\el.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\en.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\es.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\eu.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\fa.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\fi.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\fr.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\he.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\hr.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\hu.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\hy-AM.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\id.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\it.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ja.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\kg.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\km.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ko.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ku.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\kz.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\lt.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\lv.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\mn.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\nb-NO.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\nl.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\pl.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\pt-br.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\pt.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ro.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ru-RU.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\sk.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\sl.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\sr.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\sv-SE.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ta.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\th.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\tk.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\tr-TR.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ua.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\ug-CN.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\uz-UZ.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\vi.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\zh-CN.js +..\simpleui\static\admin\simpleui-x\elementui\locale\lang\zh-TW.js +..\simpleui\static\admin\simpleui-x\elementui\main.js +..\simpleui\static\admin\simpleui-x\elementui\menu-item-group.js +..\simpleui\static\admin\simpleui-x\elementui\menu-item.js +..\simpleui\static\admin\simpleui-x\elementui\menu.js +..\simpleui\static\admin\simpleui-x\elementui\message-box.js +..\simpleui\static\admin\simpleui-x\elementui\message.js +..\simpleui\static\admin\simpleui-x\elementui\mixins\emitter.js +..\simpleui\static\admin\simpleui-x\elementui\mixins\focus.js +..\simpleui\static\admin\simpleui-x\elementui\mixins\locale.js +..\simpleui\static\admin\simpleui-x\elementui\mixins\migrating.js +..\simpleui\static\admin\simpleui-x\elementui\notification.js +..\simpleui\static\admin\simpleui-x\elementui\option-group.js +..\simpleui\static\admin\simpleui-x\elementui\option.js +..\simpleui\static\admin\simpleui-x\elementui\page-header.js +..\simpleui\static\admin\simpleui-x\elementui\pagination.js +..\simpleui\static\admin\simpleui-x\elementui\popover.js +..\simpleui\static\admin\simpleui-x\elementui\progress.js +..\simpleui\static\admin\simpleui-x\elementui\radio-button.js +..\simpleui\static\admin\simpleui-x\elementui\radio-group.js +..\simpleui\static\admin\simpleui-x\elementui\radio.js +..\simpleui\static\admin\simpleui-x\elementui\rate.js +..\simpleui\static\admin\simpleui-x\elementui\row.js +..\simpleui\static\admin\simpleui-x\elementui\scrollbar.js +..\simpleui\static\admin\simpleui-x\elementui\select.js +..\simpleui\static\admin\simpleui-x\elementui\slider.js +..\simpleui\static\admin\simpleui-x\elementui\spinner.js +..\simpleui\static\admin\simpleui-x\elementui\step.js +..\simpleui\static\admin\simpleui-x\elementui\steps.js +..\simpleui\static\admin\simpleui-x\elementui\submenu.js +..\simpleui\static\admin\simpleui-x\elementui\switch.js +..\simpleui\static\admin\simpleui-x\elementui\tab-pane.js +..\simpleui\static\admin\simpleui-x\elementui\table-column.js +..\simpleui\static\admin\simpleui-x\elementui\table.js +..\simpleui\static\admin\simpleui-x\elementui\tabs.js +..\simpleui\static\admin\simpleui-x\elementui\tag.js +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\alert.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\aside.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\autocomplete.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\avatar.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\backtop.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\badge.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\base.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\breadcrumb-item.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\breadcrumb.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\button-group.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\button.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\calendar.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\card.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\carousel-item.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\carousel.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\cascader-panel.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\cascader.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\checkbox-button.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\checkbox-group.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\checkbox.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\col.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\collapse-item.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\collapse.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\color-picker.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\container.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\date-picker.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\dialog.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\display.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\divider.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\drawer.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\dropdown-item.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\dropdown-menu.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\dropdown.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\fonts\element-icons.ttf +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\fonts\element-icons.woff +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\footer.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\form-item.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\form.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\header.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\icon.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\image.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\index.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\infinite-scroll.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\infiniteScroll.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\input-number.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\input.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\link.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\loading.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\main.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\menu-item-group.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\menu-item.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\menu.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\message-box.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\message.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\notification.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\option-group.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\option.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\page-header.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\pagination.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\popover.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\popper.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\progress.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\radio-button.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\radio-group.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\radio.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\rate.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\reset.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\row.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\scrollbar.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\select-dropdown.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\select.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\slider.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\spinner.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\step.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\steps.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\submenu.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\switch.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\tab-pane.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\table-column.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\table.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\tabs.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\tag.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\time-picker.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\time-select.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\timeline-item.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\timeline.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\tooltip.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\transfer.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\tree.css +..\simpleui\static\admin\simpleui-x\elementui\theme-chalk\upload.css +..\simpleui\static\admin\simpleui-x\elementui\time-picker.js +..\simpleui\static\admin\simpleui-x\elementui\time-select.js +..\simpleui\static\admin\simpleui-x\elementui\timeline-item.js +..\simpleui\static\admin\simpleui-x\elementui\timeline.js +..\simpleui\static\admin\simpleui-x\elementui\tooltip.js +..\simpleui\static\admin\simpleui-x\elementui\transfer.js +..\simpleui\static\admin\simpleui-x\elementui\transitions\collapse-transition.js +..\simpleui\static\admin\simpleui-x\elementui\tree.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\af-ZA.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ar.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\bg.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ca.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\cs-CZ.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\da.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\de.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ee.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\el.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\en.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\es.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\eu.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\fa.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\fi.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\fr.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\he.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\hr.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\hu.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\hy-AM.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\id.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\it.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ja.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\kg.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\km.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ko.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ku.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\kz.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\lt.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\lv.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\mn.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\nb-NO.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\nl.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\pl.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\pt-br.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\pt.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ro.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ru-RU.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\sk.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\sl.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\sr.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\sv-SE.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ta.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\th.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\tk.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\tr-TR.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ua.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\ug-CN.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\uz-UZ.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\vi.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\zh-CN.js +..\simpleui\static\admin\simpleui-x\elementui\umd\locale\zh-TW.js +..\simpleui\static\admin\simpleui-x\elementui\upload.js +..\simpleui\static\admin\simpleui-x\elementui\utils\after-leave.js +..\simpleui\static\admin\simpleui-x\elementui\utils\aria-dialog.js +..\simpleui\static\admin\simpleui-x\elementui\utils\aria-utils.js +..\simpleui\static\admin\simpleui-x\elementui\utils\clickoutside.js +..\simpleui\static\admin\simpleui-x\elementui\utils\date-util.js +..\simpleui\static\admin\simpleui-x\elementui\utils\date.js +..\simpleui\static\admin\simpleui-x\elementui\utils\dom.js +..\simpleui\static\admin\simpleui-x\elementui\utils\menu\aria-menubar.js +..\simpleui\static\admin\simpleui-x\elementui\utils\menu\aria-menuitem.js +..\simpleui\static\admin\simpleui-x\elementui\utils\menu\aria-submenu.js +..\simpleui\static\admin\simpleui-x\elementui\utils\merge.js +..\simpleui\static\admin\simpleui-x\elementui\utils\popper.js +..\simpleui\static\admin\simpleui-x\elementui\utils\popup\index.js +..\simpleui\static\admin\simpleui-x\elementui\utils\popup\popup-manager.js +..\simpleui\static\admin\simpleui-x\elementui\utils\resize-event.js +..\simpleui\static\admin\simpleui-x\elementui\utils\scroll-into-view.js +..\simpleui\static\admin\simpleui-x\elementui\utils\scrollbar-width.js +..\simpleui\static\admin\simpleui-x\elementui\utils\shared.js +..\simpleui\static\admin\simpleui-x\elementui\utils\types.js +..\simpleui\static\admin\simpleui-x\elementui\utils\util.js +..\simpleui\static\admin\simpleui-x\elementui\utils\vdom.js +..\simpleui\static\admin\simpleui-x\elementui\utils\vue-popper.js +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\css\all.min.css +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-brands-400.eot +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-brands-400.svg +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-brands-400.ttf +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-brands-400.woff +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-brands-400.woff2 +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-regular-400.eot +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-regular-400.svg +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-regular-400.ttf +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-regular-400.woff +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-regular-400.woff2 +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-solid-900.eot +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-solid-900.svg +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-solid-900.ttf +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-solid-900.woff +..\simpleui\static\admin\simpleui-x\fontawesome-free-5.8.1-web\webfonts\fa-solid-900.woff2 +..\simpleui\static\admin\simpleui-x\img\bg.svg +..\simpleui\static\admin\simpleui-x\img\favicon.png +..\simpleui\static\admin\simpleui-x\img\logo.png +..\simpleui\static\admin\simpleui-x\js\cookie.js +..\simpleui\static\admin\simpleui-x\js\index.js +..\simpleui\static\admin\simpleui-x\js\language.js +..\simpleui\static\admin\simpleui-x\js\login.js +..\simpleui\static\admin\simpleui-x\js\vue.min.js +..\simpleui\static\admin\simpleui-x\locale\en-us.js +..\simpleui\static\admin\simpleui-x\locale\zh-hans.js +..\simpleui\static\admin\simpleui-x\particles\app.js +..\simpleui\static\admin\simpleui-x\particles\particles.js +..\simpleui\static\admin\simpleui-x\theme\admin.lte.css +..\simpleui\static\admin\simpleui-x\theme\admin.lte.css.map +..\simpleui\static\admin\simpleui-x\theme\admin.lte.less +..\simpleui\static\admin\simpleui-x\theme\aircraft.css +..\simpleui\static\admin\simpleui-x\theme\aircraft.css.map +..\simpleui\static\admin\simpleui-x\theme\aircraft.less +..\simpleui\static\admin\simpleui-x\theme\ant.design.css +..\simpleui\static\admin\simpleui-x\theme\ant.design.css.map +..\simpleui\static\admin\simpleui-x\theme\ant.design.less +..\simpleui\static\admin\simpleui-x\theme\base.less +..\simpleui\static\admin\simpleui-x\theme\black.css +..\simpleui\static\admin\simpleui-x\theme\black.css.map +..\simpleui\static\admin\simpleui-x\theme\black.less +..\simpleui\static\admin\simpleui-x\theme\dark.green.css +..\simpleui\static\admin\simpleui-x\theme\dark.green.css.map +..\simpleui\static\admin\simpleui-x\theme\dark.green.less +..\simpleui\static\admin\simpleui-x\theme\e-black-pro.css +..\simpleui\static\admin\simpleui-x\theme\e-black-pro.css.map +..\simpleui\static\admin\simpleui-x\theme\e-black-pro.less +..\simpleui\static\admin\simpleui-x\theme\e-black.css +..\simpleui\static\admin\simpleui-x\theme\e-black.css.map +..\simpleui\static\admin\simpleui-x\theme\e-black.less +..\simpleui\static\admin\simpleui-x\theme\e-blue-pro.css +..\simpleui\static\admin\simpleui-x\theme\e-blue-pro.css.map +..\simpleui\static\admin\simpleui-x\theme\e-blue-pro.less +..\simpleui\static\admin\simpleui-x\theme\e-blue.css +..\simpleui\static\admin\simpleui-x\theme\e-blue.css.map +..\simpleui\static\admin\simpleui-x\theme\e-blue.less +..\simpleui\static\admin\simpleui-x\theme\e-green-pro.css +..\simpleui\static\admin\simpleui-x\theme\e-green-pro.css.map +..\simpleui\static\admin\simpleui-x\theme\e-green-pro.less +..\simpleui\static\admin\simpleui-x\theme\e-green.css +..\simpleui\static\admin\simpleui-x\theme\e-green.css.map +..\simpleui\static\admin\simpleui-x\theme\e-green.less +..\simpleui\static\admin\simpleui-x\theme\e-purple-pro.css +..\simpleui\static\admin\simpleui-x\theme\e-purple-pro.css.map +..\simpleui\static\admin\simpleui-x\theme\e-purple-pro.less +..\simpleui\static\admin\simpleui-x\theme\e-purple.css +..\simpleui\static\admin\simpleui-x\theme\e-purple.css.map +..\simpleui\static\admin\simpleui-x\theme\e-purple.less +..\simpleui\static\admin\simpleui-x\theme\e-red-pro.css +..\simpleui\static\admin\simpleui-x\theme\e-red-pro.css.map +..\simpleui\static\admin\simpleui-x\theme\e-red-pro.less +..\simpleui\static\admin\simpleui-x\theme\e-red.css +..\simpleui\static\admin\simpleui-x\theme\e-red.css.map +..\simpleui\static\admin\simpleui-x\theme\e-red.less +..\simpleui\static\admin\simpleui-x\theme\element.css +..\simpleui\static\admin\simpleui-x\theme\element.css.map +..\simpleui\static\admin\simpleui-x\theme\element.less +..\simpleui\static\admin\simpleui-x\theme\gray.css +..\simpleui\static\admin\simpleui-x\theme\gray.css.map +..\simpleui\static\admin\simpleui-x\theme\gray.less +..\simpleui\static\admin\simpleui-x\theme\green.css +..\simpleui\static\admin\simpleui-x\theme\green.css.map +..\simpleui\static\admin\simpleui-x\theme\green.less +..\simpleui\static\admin\simpleui-x\theme\highdmin.css +..\simpleui\static\admin\simpleui-x\theme\highdmin.css.map +..\simpleui\static\admin\simpleui-x\theme\highdmin.less +..\simpleui\static\admin\simpleui-x\theme\layui.css +..\simpleui\static\admin\simpleui-x\theme\layui.css.map +..\simpleui\static\admin\simpleui-x\theme\layui.less +..\simpleui\static\admin\simpleui-x\theme\light.css +..\simpleui\static\admin\simpleui-x\theme\light.css.map +..\simpleui\static\admin\simpleui-x\theme\light.less +..\simpleui\static\admin\simpleui-x\theme\orange.css +..\simpleui\static\admin\simpleui-x\theme\orange.css.map +..\simpleui\static\admin\simpleui-x\theme\orange.less +..\simpleui\static\admin\simpleui-x\theme\purple.css +..\simpleui\static\admin\simpleui-x\theme\purple.css.map +..\simpleui\static\admin\simpleui-x\theme\purple.less +..\simpleui\static\admin\simpleui-x\theme\simpleui.css +..\simpleui\static\admin\simpleui-x\theme\simpleui.css.map +..\simpleui\static\admin\simpleui-x\theme\simpleui.less +..\simpleui\static\admin\simpleui-x\theme\theme.js +..\simpleui\static\admin\simpleui-x\theme\x-blue.css +..\simpleui\static\admin\simpleui-x\theme\x-blue.css.map +..\simpleui\static\admin\simpleui-x\theme\x-blue.less +..\simpleui\static\admin\simpleui-x\theme\x-green.css +..\simpleui\static\admin\simpleui-x\theme\x-green.css.map +..\simpleui\static\admin\simpleui-x\theme\x-green.less +..\simpleui\static\admin\simpleui-x\theme\x-red.css +..\simpleui\static\admin\simpleui-x\theme\x-red.css.map +..\simpleui\static\admin\simpleui-x\theme\x-red.less +..\simpleui\static\admin\simpleui-x\waves\waves.min.css +..\simpleui\static\admin\simpleui-x\waves\waves.min.js +..\simpleui\static\admin\simpleui-x\waves\waves.min.js.map +..\simpleui\static\import_export\action_formats.js +..\simpleui\templates\admin\404.html +..\simpleui\templates\admin\500.html +..\simpleui\templates\admin\actions.html +..\simpleui\templates\admin\app_index.html +..\simpleui\templates\admin\base.html +..\simpleui\templates\admin\base_site.html +..\simpleui\templates\admin\change_form.html +..\simpleui\templates\admin\change_form_object_tools.html +..\simpleui\templates\admin\change_list.html +..\simpleui\templates\admin\change_list_object_tools.html +..\simpleui\templates\admin\change_list_results.html +..\simpleui\templates\admin\date_hierarchy.html +..\simpleui\templates\admin\filter.html +..\simpleui\templates\admin\home.html +..\simpleui\templates\admin\includes\css-part.html +..\simpleui\templates\admin\includes\fieldset.html +..\simpleui\templates\admin\includes\js-part.html +..\simpleui\templates\admin\index.html +..\simpleui\templates\admin\invalid_setup.html +..\simpleui\templates\admin\login.html +..\simpleui\templates\admin\object_history.html +..\simpleui\templates\admin\pagination.html +..\simpleui\templates\admin\popup_response.html +..\simpleui\templates\admin\prepopulated_fields_js.html +..\simpleui\templates\admin\related_widget_wrapper.html +..\simpleui\templates\admin\search_form.html +..\simpleui\templates\admin\submit_line.html +..\simpleui\templates\registration\logged_out.html +..\simpleui\templates\registration\password_change_done.html +..\simpleui\templates\registration\password_change_form.html +..\simpleui\templates\registration\password_reset_complete.html +..\simpleui\templates\registration\password_reset_confirm.html +..\simpleui\templates\registration\password_reset_done.html +..\simpleui\templates\registration\password_reset_email.html +..\simpleui\templates\registration\password_reset_form.html +..\simpleui\templatetags\__init__.py +..\simpleui\templatetags\__pycache__\__init__.cpython-37.pyc +..\simpleui\templatetags\__pycache__\__init__.cpython-39.pyc +..\simpleui\templatetags\__pycache__\simpletags.cpython-37.pyc +..\simpleui\templatetags\__pycache__\simpletags.cpython-39.pyc +..\simpleui\templatetags\simpletags.py +..\simpleui\widgets.py +PKG-INFO +SOURCES.txt +dependency_links.txt +not-zip-safe +requires.txt +top_level.txt diff --git a/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/not-zip-safe b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/requires.txt b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/requires.txt new file mode 100644 index 0000000..d3e4ba5 --- /dev/null +++ b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/requires.txt @@ -0,0 +1 @@ +django diff --git a/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/top_level.txt b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/top_level.txt new file mode 100644 index 0000000..a4732b8 --- /dev/null +++ b/venv/Lib/site-packages/simpleui-4.0.2-py3.9.egg-info/top_level.txt @@ -0,0 +1 @@ +simpleui diff --git a/venv/Lib/site-packages/simpleui/__init__.py b/venv/Lib/site-packages/simpleui/__init__.py new file mode 100644 index 0000000..d8741a9 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/__init__.py @@ -0,0 +1,5 @@ +default_app_config = 'simpleui.apps.SimpleApp' + + +def get_version(): + return '4.0.2' diff --git a/venv/Lib/site-packages/simpleui/apps.py b/venv/Lib/site-packages/simpleui/apps.py new file mode 100644 index 0000000..9673fbc --- /dev/null +++ b/venv/Lib/site-packages/simpleui/apps.py @@ -0,0 +1,21 @@ +from django.apps import AppConfig + + +class SimpleApp(AppConfig): + name = 'simpleui' + + def ready(self): + # 如果是django3+ 就使用中间件,删除header中的X-Frame-Options + + try: + import django + version = django.get_version() + if int(version.split('.')[0]) >= 3: + from django.conf import settings + for index, item in enumerate(settings.MIDDLEWARE): + if item == 'django.middleware.clickjacking.XFrameOptionsMiddleware': + settings.MIDDLEWARE.pop(index) + + except Exception as e: + pass + pass diff --git a/venv/Lib/site-packages/simpleui/forms.py b/venv/Lib/site-packages/simpleui/forms.py new file mode 100644 index 0000000..7a8f856 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/forms.py @@ -0,0 +1,202 @@ +# -*- encoding: utf-8 -*- +""" +@File : forms.py +@Time : 2020/1/3 11:14 +@Author : chise +@Email : chise123@live.com +@Software: PyCharm +@info :simpleui自定义表单 +""" +from django import forms +import uuid + +from django.core import validators +from django.core.exceptions import ValidationError +# Provide this import for backwards compatibility. +from django.core.validators import EMPTY_VALUES # NOQA +from django.forms.boundfield import BoundField +from django.forms.forms import DeclarativeFieldsMetaclass, BaseForm +from django.forms.utils import from_current_timezone, to_current_timezone +from django.forms.widgets import ( + FILE_INPUT_CONTRADICTION, CheckboxInput, ClearableFileInput, DateInput, + DateTimeInput, EmailInput, FileInput, HiddenInput, MultipleHiddenInput, + NullBooleanSelect, NumberInput, Select, SelectMultiple, + SplitDateTimeWidget, SplitHiddenDateTimeWidget, TextInput, TimeInput, + URLInput, +) +from django.utils import formats +from django.utils.dateparse import parse_duration +from django.utils.duration import duration_string +from django.utils.ipv6 import clean_ipv6_address +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _, ngettext_lazy + + +import copy + +from django.core.exceptions import NON_FIELD_ERRORS, ValidationError +# BoundField is imported for backwards compatibility in Django 1.9 +from django.forms.boundfield import BoundField # NOQA +from django.forms.fields import Field, FileField +# pretty_name is imported for backwards compatibility in Django 1.9 +from django.forms.utils import ErrorDict, ErrorList, pretty_name # NOQA +from django.forms.widgets import Media, MediaDefiningClass +from django.utils.functional import cached_property +from django.utils.html import conditional_escape, html_safe +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _ +from widgets import * + +class SimpleForm(BaseForm, metaclass=DeclarativeFieldsMetaclass): + def get_vue_app_js(self,app_id): + """ + 将该方法需要的js渲染进去 + :return: + """ + base_vue_app=""" + + """ + data={} + for name, field in self.fields.items(): + data[name] = '' + data.update(self.data) + data_s="" + for key,value in data.items(): + data_s+="%(key)s:'%(value)s'"%{ + 'key':key, + 'value':value + }+',' + return base_vue_app %{"app_name":app_id,"data":data_s} + def submit_button(self): + """ + 渲染模板增加submit格式 + :return: + """ + # return '' + + + pass + def as_element(self): + "Return this form rendered as HTML s -- excluding the
." + x= self._html_output( + normal_row='
%(label)s %(field)s%(help_text)s
', + error_row='%s', + row_ender='', + help_text_html=' %s', + errors_on_separate_row=True,flag=True + ) + return x + + def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row,flag=False): + "Output HTML. Used by as_table(), as_ul(), as_p()." + top_errors = self.non_field_errors() # Errors that should be displayed above all fields. + output, hidden_fields = [], [] + + for name, field in self.fields.items(): + html_class_attr = '' + bf = self[name] + if flag: + bf.field.widget.flag=True + bf_errors = self.error_class(bf.errors) + if bf.is_hidden: + if bf_errors: + top_errors.extend( + [_('(Hidden field %(name)s) %(error)s') % {'name': name, 'error': str(e)} + for e in bf_errors]) + hidden_fields.append(str(bf)) + else: + # Create a 'class="..."' attribute if the row should have any + # CSS classes applied. + css_classes = bf.css_classes() + if css_classes: + html_class_attr = ' class="%s"' % css_classes + + if errors_on_separate_row and bf_errors: + output.append(error_row % str(bf_errors)) + + if bf.label: + label = conditional_escape(bf.label) + label = bf.label_tag(label) or '' + else: + label = '' + + if field.help_text: + help_text = help_text_html % field.help_text + else: + help_text = '' + + output.append(normal_row % { + 'errors': bf_errors, + 'label': label, + 'field': bf, + 'help_text': help_text, + 'html_class_attr': html_class_attr, + 'css_classes': css_classes, + 'field_name': bf.html_name, + }) + + if top_errors: + output.insert(0, error_row % top_errors) + if hidden_fields: # Insert any hidden fields in the last row. + str_hidden = ''.join(hidden_fields) + if output: + last_row = output[-1] + # Chop off the trailing row_ender (e.g. '') and + # insert the hidden fields. + if not last_row.endswith(row_ender): + # This can happen in the as_p() case (and possibly others + # that users write): if there are only top errors, we may + # not be able to conscript the last row for our purposes, + # so insert a new, empty row. + last_row = (normal_row % { + 'errors': '', + 'label': '', + 'field': '', + 'help_text': '', + 'html_class_attr': html_class_attr, + 'css_classes': '', + 'field_name': '', + }) + output.append(last_row) + output[-1] = last_row[:-len(row_ender)] + str_hidden + row_ender + else: + # If there aren't any rows in the output, just append the + # hidden fields. + output.append(str_hidden) + if flag: + app_id = "x" + str(uuid.uuid4())[0:5] + output.insert(0, "
" %app_id) + output.append('
') + output.append(self.get_vue_app_js(app_id)) + return mark_safe('\n'.join(output)) + +class SCharField(forms.CharField): + widget = STextInput +class SIntegerField(forms.IntegerField): + def widget_attrs(self, widget): + """ + 解决max和min无法传递到widget的问题 + """ + attrs = super().widget_attrs(widget) + if isinstance(widget, NumberInput) or isinstance(widget,SNumberInput): + if self.min_value is not None: + attrs['min'] = self.min_value + if self.max_value is not None: + attrs['max'] = self.max_value + return attrs + widget = SNumberInput + +class SEmailField(forms.EmailField): + widget = SEmailInput + +class SURLField(forms.URLField): + widget = SURLInput \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/autocomplete.css b/venv/Lib/site-packages/simpleui/static/admin/css/autocomplete.css new file mode 100644 index 0000000..3ef95d1 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/autocomplete.css @@ -0,0 +1,260 @@ +select.admin-autocomplete { + width: 20em; +} + +.select2-container--admin-autocomplete.select2-container { + min-height: 30px; +} + +.select2-container--admin-autocomplete .select2-selection--single, +.select2-container--admin-autocomplete .select2-selection--multiple { + min-height: 30px; + padding: 0; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection, +.select2-container--admin-autocomplete.select2-container--open .select2-selection { + border-color: #999; + min-height: 30px; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single, +.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single { + padding: 0; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple, +.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple { + padding: 0; +} + +.select2-container--admin-autocomplete .select2-selection--single { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 4px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 30px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { + color: #999; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; +} + +.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; +} + +.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple { + background-color: white; + border: 1px solid #ccc; + border-radius: 4px; + cursor: text; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { + list-style: none; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { + color: #999; + margin-top: 5px; + float: left; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin: 5px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #ccc; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { + border: solid #999 1px; + outline: 0; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; +} + +.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove { + display: none; +} + +.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { + border: 1px solid #ccc; +} + +.select2-container--admin-autocomplete .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; +} + +.select2-container--admin-autocomplete .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--admin-autocomplete .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { + color: #999; +} + +.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { + background-color: #ddd; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option { + padding-left: 1em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; +} + +.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; +} + +.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { + background-color: #79aec8; + color: white; +} + +.select2-container--admin-autocomplete .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/base.css b/venv/Lib/site-packages/simpleui/static/admin/css/base.css new file mode 100644 index 0000000..b87f94e --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/base.css @@ -0,0 +1,981 @@ +/* + DJANGO Admin styles +*/ +@import url(fonts.css); + +body { + margin: 0; + padding: 0; + font-size: 14px; + font-family: "Roboto", "Lucida Grande", "DejaVu Sans", "Bitstream Vera Sans", Verdana, Arial, sans-serif; + color: #333; + background: #fff; +} + +/* LINKS */ + +a:link, a:visited { + color: #447e9b; + text-decoration: none; +} + +a:focus, a:hover { + color: #036; +} + +a:focus { + text-decoration: underline; +} + +a img { + border: none; +} + +a.section:link, a.section:visited { + color: #fff; + text-decoration: none; +} + +a.section:focus, a.section:hover { + text-decoration: underline; +} + +/* GLOBAL DEFAULTS */ + +p, ol, ul, dl { + margin: .2em 0 .8em 0; +} + +p { + padding: 0; + line-height: 140%; +} + +h1, h2, h3, h4, h5 { + font-weight: bold; +} + +h1 { + margin: 0 0 20px; + font-weight: 300; + font-size: 20px; + color: #666; +} + +h2 { + font-size: 16px; + margin: 1em 0 .5em 0; +} + +h2.subhead { + font-weight: normal; + margin-top: 0; +} + +h3 { + font-size: 14px; + margin: .8em 0 .3em 0; + color: #666; + font-weight: bold; +} + +h4 { + font-size: 12px; + margin: 1em 0 .8em 0; + padding-bottom: 3px; +} + +h5 { + font-size: 10px; + margin: 1.5em 0 .5em 0; + color: #666; + text-transform: uppercase; + letter-spacing: 1px; +} + +ul li { + list-style-type: square; + padding: 1px 0; +} + +li ul { + margin-bottom: 0; +} + +li, dt, dd { + font-size: 13px; + line-height: 20px; +} + +dt { + font-weight: bold; + margin-top: 4px; +} + +dd { + margin-left: 0; +} + +form { + margin: 0; + padding: 0; +} + +fieldset { + margin: 0; + padding: 0; + border: none; + border-top: 1px solid #eee; +} + +blockquote { + font-size: 11px; + color: #777; + margin-left: 2px; + padding-left: 10px; + border-left: 5px solid #ddd; +} + +code, pre { + font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; + color: #666; + font-size: 12px; +} + +pre.literal-block { + margin: 10px; + background: #eee; + padding: 6px 8px; +} + +code strong { + color: #930; +} + +hr { + clear: both; + color: #eee; + background-color: #eee; + height: 1px; + border: none; + margin: 0; + padding: 0; + font-size: 1px; + line-height: 1px; +} + +/* TEXT STYLES & MODIFIERS */ + +.small { + font-size: 11px; +} + +.tiny { + font-size: 10px; +} + +p.tiny { + margin-top: -2px; +} + +.mini { + font-size: 10px; +} + +p.mini { + margin-top: -3px; +} + +.help, p.help, form p.help, div.help, form div.help, div.help li { + font-size: 11px; + color: #999; +} + +div.help ul { + margin-bottom: 0; +} + +.help-tooltip { + cursor: help; +} + +p img, h1 img, h2 img, h3 img, h4 img, td img { + vertical-align: middle; +} + +.quiet, a.quiet:link, a.quiet:visited { + color: #999; + font-weight: normal; +} + +.float-right { + float: right; +} + +.float-left { + float: left; +} + +.clear { + clear: both; +} + +.align-left { + text-align: left; +} + +.align-right { + text-align: right; +} + +.example { + margin: 10px 0; + padding: 5px 10px; + background: #efefef; +} + +.nowrap { + white-space: nowrap; +} + +/* TABLES */ + +table { + border-collapse: collapse; + border-color: #ccc; +} + +td, th { + font-size: 13px; + line-height: 16px; + border-bottom: 1px solid #eee; + vertical-align: top; + padding: 8px; + font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; +} + +th { + font-weight: 600; + text-align: left; +} + +thead th, +tfoot td { + color: #666; + padding: 5px 10px; + font-size: 11px; + background: #fff; + border: none; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; +} + +tfoot td { + border-bottom: none; + border-top: 1px solid #eee; +} + +thead th.required { + color: #000; +} + +tr.alt { + background: #f6f6f6; +} + +.row1 { + background: #fff; +} + +.row2 { + background: #f9f9f9; +} + +/* SORTABLE TABLES */ + +thead th { + padding: 5px 10px; + line-height: normal; + text-transform: uppercase; + background: #f6f6f6; +} + +thead th a:link, thead th a:visited { + color: #666; +} + +thead th.sorted { + background: #eee; +} + +thead th.sorted .text { + padding-right: 42px; +} + +table thead th .text span { + padding: 8px 10px; + display: block; +} + +table thead th .text a { + display: block; + cursor: pointer; + padding: 8px 10px; +} + +table thead th .text a:focus, table thead th .text a:hover { + background: #eee; +} + +thead th.sorted a.sortremove { + visibility: hidden; +} + +table thead th.sorted:hover a.sortremove { + visibility: visible; +} + +table thead th.sorted .sortoptions { + display: block; + padding: 9px 5px 0 5px; + float: right; + text-align: right; +} + +table thead th.sorted .sortpriority { + font-size: .8em; + min-width: 12px; + text-align: center; + vertical-align: 3px; + margin-left: 2px; + margin-right: 2px; +} + +table thead th.sorted .sortoptions a { + position: relative; + width: 14px; + height: 14px; + display: inline-block; + background: url(../img/sorting-icons.svg) 0 0 no-repeat; + background-size: 14px auto; +} + +table thead th.sorted .sortoptions a.sortremove { + background-position: 0 0; +} + +table thead th.sorted .sortoptions a.sortremove:after { + content: '\\'; + position: absolute; + top: -6px; + left: 3px; + font-weight: 200; + font-size: 18px; + color: #999; +} + +table thead th.sorted .sortoptions a.sortremove:focus:after, +table thead th.sorted .sortoptions a.sortremove:hover:after { + color: #447e9b; +} + +table thead th.sorted .sortoptions a.sortremove:focus, +table thead th.sorted .sortoptions a.sortremove:hover { + background-position: 0 -14px; +} + +table thead th.sorted .sortoptions a.ascending { + background-position: 0 -28px; +} + +table thead th.sorted .sortoptions a.ascending:focus, +table thead th.sorted .sortoptions a.ascending:hover { + background-position: 0 -42px; +} + +table thead th.sorted .sortoptions a.descending { + top: 1px; + background-position: 0 -56px; +} + +table thead th.sorted .sortoptions a.descending:focus, +table thead th.sorted .sortoptions a.descending:hover { + background-position: 0 -70px; +} + +/* FORM DEFAULTS */ + +input, textarea, select, .form-row p, form .button { + margin: 2px 0; + padding: 2px 3px; + vertical-align: middle; + font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; + font-weight: normal; + font-size: 13px; +} + +.form-row div.help { + padding: 2px 3px; +} + +textarea { + vertical-align: top; +} + +input[type=text], input[type=password], input[type=email], input[type=url], +input[type=number], input[type=tel], textarea, select, .vTextField { + border: 1px solid #ccc; + border-radius: 4px; + padding: 5px 6px; + margin-top: 0; +} + +input[type=text]:focus, input[type=password]:focus, input[type=email]:focus, +input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus, +textarea:focus, select:focus, .vTextField:focus { + border-color: #409EFF; +} + +select { + height: 30px; +} + +select[multiple] { + min-height: 150px; +} + +/* FORM BUTTONS */ + +.button, input[type=submit], input[type=button], .submit-row input, a.button { + background: #79aec8; + padding: 10px 15px; + border: none; + border-radius: 4px; + color: #fff; + cursor: pointer; +} + +a.button { + padding: 4px 5px; +} + +.button:active, input[type=submit]:active, input[type=button]:active, +.button:focus, input[type=submit]:focus, input[type=button]:focus, +.button:hover, input[type=submit]:hover, input[type=button]:hover { + background: #609ab6; +} + +.button[disabled], input[type=submit][disabled], input[type=button][disabled] { + opacity: 0.4; +} + +.button.default, input[type=submit].default, .submit-row input.default { + float: right; + border: none; + font-weight: 400; + background: #417690; +} + +.button.default:active, input[type=submit].default:active, +.button.default:focus, input[type=submit].default:focus, +.button.default:hover, input[type=submit].default:hover { + background: #205067; +} + +.button[disabled].default, +input[type=submit][disabled].default, +input[type=button][disabled].default { + opacity: 0.4; +} + + +/* MODULES */ + +.module { + border: none; + margin-bottom: 30px; + background: #fff; +} + +.module p, .module ul, .module h3, .module h4, .module dl, .module pre { + padding-left: 10px; + padding-right: 10px; +} + +.module blockquote { + margin-left: 12px; +} + +.module ul, .module ol { + margin-left: 1.5em; +} + +.module h3 { + margin-top: .6em; +} + +.module h2, .module caption, .inline-group h2 { + margin: 0; + padding: 8px; + font-weight: 400; + font-size: 13px; + text-align: left; + background: #79aec8; + color: #fff; +} + +.module caption, +.inline-group h2 { + font-size: 12px; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +.module table { + border-collapse: collapse; +} + +/* MESSAGES & ERRORS */ + +ul.messagelist { + padding: 0; + margin: 0; +} + +ul.messagelist li { + display: block; + font-weight: 400; + font-size: 13px; + padding: 10px 10px 10px 65px; + margin: 0 0 10px 0; + background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat; + background-size: 16px auto; + color: #333; +} + +ul.messagelist li.warning { + background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat; + background-size: 14px auto; +} + +ul.messagelist li.error { + background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat; + background-size: 16px auto; +} + +.errornote { + font-size: 14px; + font-weight: 700; + display: block; + padding: 10px 12px; + margin: 0 0 10px 0; + color: #ba2121; + border: 1px solid #ba2121; + border-radius: 4px; + background-color: #fff; + background-position: 5px 12px; +} + +ul.errorlist { + margin: 0 0 4px; + padding: 0; + color: #ba2121; + background: #fff; +} + +ul.errorlist li { + font-size: 13px; + display: block; + margin-bottom: 4px; +} + +ul.errorlist li:first-child { + margin-top: 0; +} + +ul.errorlist li a { + color: inherit; + text-decoration: underline; +} + +td ul.errorlist { + margin: 0; + padding: 0; +} + +td ul.errorlist li { + margin: 0; +} + +.form-row.errors { + margin: 0; + border: none; + border-bottom: 1px solid #eee; + background: none; +} + +.form-row.errors ul.errorlist li { + padding-left: 0; +} + +.errors input, .errors select, .errors textarea { + border: 1px solid #ba2121; +} + +div.system-message { + background: #ffc; + margin: 10px; + padding: 6px 8px; + font-size: .8em; +} + +div.system-message p.system-message-title { + padding: 4px 5px 4px 25px; + margin: 0; + color: #c11; + background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat; +} + +.description { + font-size: 12px; + padding: 5px 0 0 12px; +} + +/* BREADCRUMBS */ + +div.breadcrumbs { + background: #79aec8; + padding: 10px 40px; + border: none; + font-size: 14px; + color: #c4dce8; + text-align: left; +} + +div.breadcrumbs a { + color: #fff; +} + +div.breadcrumbs a:focus, div.breadcrumbs a:hover { + color: #c4dce8; +} + +/* ACTION ICONS */ + +.addlink { + padding-left: 16px; + background: url(../img/icon-addlink.svg) 0 1px no-repeat; +} + +.changelink, .inlinechangelink { + padding-left: 16px; + background: url(../img/icon-changelink.svg) 0 1px no-repeat; +} + +.deletelink { + padding-left: 16px; + background: url(../img/icon-deletelink.svg) 0 1px no-repeat; +} + +a.deletelink:link, a.deletelink:visited { + color: #CC3434; +} + +a.deletelink:focus, a.deletelink:hover { + color: #993333; + text-decoration: none; +} + +/* OBJECT TOOLS */ + +.object-tools { + font-size: 10px; + font-weight: bold; + padding-left: 0; + float: right; + position: relative; + margin-top: -30px; +} + +.form-row .object-tools { + margin-top: 5px; + margin-bottom: 5px; + float: none; + height: 2em; + padding-left: 3.5em; +} + +.object-tools li { + display: block; + float: left; + margin-left: 5px; + height: 16px; +} + +.object-tools a { + border-radius: 15px; +} + +.object-tools a:link, .object-tools a:visited { + display: block; + float: left; + padding: 3px 12px; + background: #999; + font-weight: 400; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.5px; + color: #fff; +} + +.object-tools a:focus, .object-tools a:hover { + background-color: #417690; +} + +.object-tools a:focus { + text-decoration: none; +} + +.object-tools a.viewsitelink, .object-tools a.golink, .object-tools a.addlink { + background-repeat: no-repeat; + background-position: right 7px center; + padding-right: 26px; +} + +.object-tools a.viewsitelink, .object-tools a.golink { + background-image: url(../img/tooltag-arrowright.svg); +} + +.object-tools a.addlink { + background-image: url(../img/tooltag-add.svg); +} + +/* OBJECT HISTORY */ + +table#change-history { + width: 100%; +} + +table#change-history tbody th { + width: 16em; +} + +/* PAGE STRUCTURE */ + +#container { + position: relative; + width: 100%; + min-width: 980px; + padding: 0; +} + +#content { + padding: 20px; + background-color: white; + margin: 20px; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1); +} + +.dashboard #content { + width: 600px; +} + +#content-main { + float: left; + width: 100%; +} + +#content-related { + float: right; + width: 260px; + position: relative; + margin-right: -300px; +} + +#footer { + clear: both; + padding: 10px; +} + +/* COLUMN TYPES */ + +.colMS { + margin-right: 300px; +} + +.colSM { + margin-left: 300px; +} + +.colSM #content-related { + float: left; + margin-right: 0; + margin-left: -300px; +} + +.colSM #content-main { + float: right; +} + +.popup .colM { + width: auto; +} + +/* HEADER */ + +#header { + width: auto; + height: 40px; + padding: 10px 40px; + background: #1b93e1; + line-height: 40px; + color: #ffc; + overflow: hidden; +} + +#header a:link, #header a:visited { + color: #fff; +} + +#header a:focus, #header a:hover { + text-decoration: underline; +} + +#branding { + float: left; +} + +#branding h1 { + padding: 0; + margin: 0 20px 0 0; + font-weight: 300; + font-size: 24px; + color: #f5dd5d; +} + +#branding h1, #branding h1 a:link, #branding h1 a:visited { + color: #FFF; +} + +#branding h2 { + padding: 0 10px; + font-size: 14px; + margin: -8px 0 8px 0; + font-weight: normal; + color: #ffc; +} + +#branding a:hover { + text-decoration: none; +} + +#user-tools { + float: right; + padding: 0; + margin: 0 0 0 20px; + font-weight: 300; + font-size: 11px; + letter-spacing: 0.5px; + text-transform: uppercase; + text-align: right; +} + +#user-tools a { + border-bottom: 1px solid rgba(255, 255, 255, 0.25); +} + +#user-tools a:focus, #user-tools a:hover { + text-decoration: none; + border-bottom-color: #79aec8; + color: #79aec8; +} + +/* SIDEBAR */ + +#content-related { + background: #f8f8f8; +} + +#content-related .module { + background: none; +} + +#content-related h3 { + font-size: 14px; + color: #666; + padding: 0 16px; + margin: 0 0 16px; +} + +#content-related h4 { + font-size: 13px; +} + +#content-related p { + padding-left: 16px; + padding-right: 16px; +} + +#content-related .actionlist { + padding: 0; + margin: 16px; +} + +#content-related .actionlist li { + line-height: 1.2; + margin-bottom: 10px; + padding-left: 18px; +} + +#content-related .module h2 { + background: none; + padding: 16px; + margin-bottom: 16px; + border-bottom: 1px solid #eaeaea; + font-size: 18px; + color: #333; +} + +.delete-confirmation form input[type="submit"] { + background: #ba2121; + border-radius: 4px; + padding: 10px 15px; + color: #fff; +} + +.delete-confirmation form input[type="submit"]:active, +.delete-confirmation form input[type="submit"]:focus, +.delete-confirmation form input[type="submit"]:hover { + background: #a41515; +} + +.delete-confirmation form .cancel-link { + display: inline-block; + vertical-align: middle; + height: 15px; + line-height: 15px; + background: #ddd; + border-radius: 4px; + padding: 10px 15px; + color: #333; + margin: 0 0 0 10px; +} + +.delete-confirmation form .cancel-link:active, +.delete-confirmation form .cancel-link:focus, +.delete-confirmation form .cancel-link:hover { + background: #ccc; +} + +/* POPUP */ +.popup #content { + padding: 20px; +} + +.popup #container { + min-width: 0; +} + +.popup #header { + padding: 10px 20px; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/changelists.css b/venv/Lib/site-packages/simpleui/static/admin/css/changelists.css new file mode 100644 index 0000000..60be83f --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/changelists.css @@ -0,0 +1,346 @@ +/* CHANGELISTS */ + +#changelist { + position: relative; + width: 100%; +} + +#changelist table { + width: 100%; +} + +.change-list .hiddenfields { + display: none; +} + +.change-list .filtered table { + border-right: none; +} + +.change-list .filtered { + min-height: 400px; +} + +.change-list .filtered .results, .change-list .filtered .paginator, +.filtered #toolbar, .filtered div.xfull { + /*margin-right: 280px;*/ + width: auto; +} + +.change-list .filtered table tbody th { + padding-right: 1em; +} + +#changelist-form .results { + overflow-x: auto; +} + +#changelist .toplinks { + border-bottom: 1px solid #ddd; +} + +#changelist .paginator { + color: #666; + border-bottom: 1px solid #eee; + background: #fff; + overflow: hidden; +} + +/* CHANGELIST TABLES */ + +#changelist table thead th { + padding: 0; + white-space: nowrap; + vertical-align: middle; +} + +#changelist table thead th.action-checkbox-column { + width: 1.5em; + text-align: center; +} + +#changelist table tbody td.action-checkbox { + text-align: center; +} + +#changelist table tfoot { + color: #666; +} + +/* TOOLBAR */ + +#changelist #toolbar { + padding: 8px 10px; + margin-bottom: 15px; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + background: #f8f8f8; + color: #666; +} + +/*#changelist #toolbar form input {*/ +/* border-radius: 4px;*/ +/* font-size: 14px;*/ +/* padding: 5px;*/ +/* color: #333;*/ +/*}*/ + +/*#changelist #toolbar form #searchbar {*/ +/* height: 32px;*/ +/* border: 1px solid #ccc;*/ +/* padding: 2px 5px;*/ +/* margin: 0;*/ +/* vertical-align: top;*/ +/* font-size: 13px;*/ +/*}*/ + +/*#changelist #toolbar form #searchbar:focus {*/ +/* border-color: #999;*/ +/*}*/ + +/*#changelist #toolbar form input[type="submit"] {*/ +/* border: 1px solid #ccc;*/ +/* padding: 2px 10px;*/ +/* margin: 0;*/ +/* vertical-align: middle;*/ +/* background: #fff;*/ +/* box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;*/ +/* cursor: pointer;*/ +/* color: #333;*/ +/*}*/ + +/*#changelist #toolbar form input[type="submit"]:focus,*/ +/*#changelist #toolbar form input[type="submit"]:hover {*/ +/* border-color: #999;*/ +/*}*/ + +#changelist #changelist-search img { + vertical-align: middle; + margin-right: 4px; +} + +/* FILTER COLUMN */ + +#changelist-filter { + position: absolute; + top: 0; + right: 0; + z-index: 1000; + width: 240px; + background: #f8f8f8; + border-left: none; + margin: 0; +} + +#changelist-filter h2 { + font-size: 14px; + text-transform: uppercase; + letter-spacing: 0.5px; + padding: 5px 15px; + margin-bottom: 12px; + border-bottom: none; +} + +#changelist-filter h3 { + font-weight: 400; + font-size: 14px; + padding: 0 15px; + margin-bottom: 10px; +} + +#changelist-filter ul { + margin: 5px 0; + padding: 0 15px 15px; + border-bottom: 1px solid #eaeaea; +} + +#changelist-filter ul:last-child { + border-bottom: none; + padding-bottom: none; +} + +#changelist-filter li { + list-style-type: none; + margin-left: 0; + padding-left: 0; +} + +#changelist-filter a { + display: block; + color: #999; + text-overflow: ellipsis; + overflow-x: hidden; +} + +#changelist-filter li.selected { + border-left: 5px solid #eaeaea; + padding-left: 10px; + margin-left: -15px; +} + +#changelist-filter li.selected a { + color: #5b80b2; +} + +#changelist-filter a:focus, #changelist-filter a:hover, +#changelist-filter li.selected a:focus, +#changelist-filter li.selected a:hover { + color: #036; +} + +/* DATE DRILLDOWN */ + +.change-list ul.toplinks { + display: block; + float: left; + padding: 0; + margin: 0; + width: 100%; +} + +.change-list ul.toplinks li { + padding: 3px 6px; + font-weight: bold; + list-style-type: none; + display: inline-block; +} + +.change-list ul.toplinks .date-back a { + color: #999; +} + +.change-list ul.toplinks .date-back a:focus, +.change-list ul.toplinks .date-back a:hover { + color: #036; +} + +/* PAGINATOR */ + +.paginator { + font-size: 13px; + padding-top: 10px; + padding-bottom: 10px; + line-height: 22px; + margin: 0; + border-top: 1px solid #ddd; +} + +.paginator a:link, .paginator a:visited { + padding: 2px 6px; + background: #79aec8; + text-decoration: none; + color: #fff; +} + +.paginator a.showall { + padding: 0; + border: none; + background: none; + color: #5b80b2; +} + +.paginator a.showall:focus, .paginator a.showall:hover { + background: none; + color: #036; +} + +.paginator .end { + margin-right: 6px; +} + +.paginator .this-page { + padding: 2px 6px; + font-weight: bold; + font-size: 13px; + vertical-align: top; +} + +.paginator a:focus, .paginator a:hover { + color: white; + background: #036; +} + +/* ACTIONS */ + +.filtered .actions { + margin-right: 280px; + border-right: none; +} + +#changelist table input { + margin: 0; + vertical-align: baseline; +} + +#changelist table tbody tr.selected { + background-color: #FFFFCC; +} + +#changelist .actions { + padding: 10px; + background: #fff; + border-top: none; + border-bottom: none; + line-height: 24px; + color: #999; +} + +#changelist .actions.selected { + background: #fffccf; + border-top: 1px solid #fffee8; + border-bottom: 1px solid #edecd6; +} + +#changelist .actions span.all, +#changelist .actions span.action-counter, +#changelist .actions span.clear, +#changelist .actions span.question { + font-size: 13px; + margin: 0 0.5em; + display: none; +} + +#changelist .actions:last-child { + border-bottom: none; +} + +#changelist .actions select { + vertical-align: top; + height: 24px; + background: none; + color: #000; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 14px; + padding: 0 0 0 4px; + margin: 0; + margin-left: 10px; +} + +#changelist .actions select:focus { + border-color: #999; +} + +#changelist .actions label { + display: inline-block; + vertical-align: middle; + font-size: 13px; +} + +#changelist .actions .button { + font-size: 13px; + border: 1px solid #ccc; + border-radius: 4px; + background: #fff; + box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; + cursor: pointer; + height: 24px; + line-height: 1; + padding: 4px 8px; + margin: 0; + color: #333; +} + +#changelist .actions .button:focus, #changelist .actions .button:hover { + border-color: #999; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/dashboard.css b/venv/Lib/site-packages/simpleui/static/admin/css/dashboard.css new file mode 100644 index 0000000..1560c7b --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/dashboard.css @@ -0,0 +1,27 @@ +/* DASHBOARD */ + +.dashboard .module table th { + width: 100%; +} + +.dashboard .module table td { + white-space: nowrap; +} + +.dashboard .module table td a { + display: block; + padding-right: .6em; +} + +/* RECENT ACTIONS MODULE */ + +.module ul.actionlist { + margin-left: 0; +} + +ul.actionlist li { + list-style-type: none; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/fonts.css b/venv/Lib/site-packages/simpleui/static/admin/css/fonts.css new file mode 100644 index 0000000..c837e01 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/fonts.css @@ -0,0 +1,20 @@ +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Bold-webfont.woff'); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Regular-webfont.woff'); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: 'Roboto'; + src: url('../fonts/Roboto-Light-webfont.woff'); + font-weight: 300; + font-style: normal; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/forms.css b/venv/Lib/site-packages/simpleui/static/admin/css/forms.css new file mode 100644 index 0000000..77985d5 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/forms.css @@ -0,0 +1,515 @@ +@import url('widgets.css'); + +/* FORM ROWS */ + +.form-row { + overflow: hidden; + padding: 10px; + font-size: 13px; + border-bottom: 1px solid #eee; +} + +.form-row img, .form-row input { + vertical-align: middle; +} + +.form-row label input[type="checkbox"] { + margin-top: 0; + vertical-align: 0; +} + +form .form-row p { + padding-left: 0; +} + +.hidden { + display: none; +} + +/* FORM LABELS */ + +label { + font-weight: normal; + color: #666; + font-size: 13px; +} + +.required label, label.required { + font-weight: bold; + color: #333; +} + +/* RADIO BUTTONS */ + +form ul.radiolist li { + list-style-type: none; +} + +form ul.radiolist label { + float: none; + display: inline; +} + +form ul.radiolist input[type="radio"] { + margin: -2px 4px 0 0; + padding: 0; +} + +form ul.inline { + margin-left: 0; + padding: 0; +} + +form ul.inline li { + float: left; + padding-right: 7px; +} + +/* ALIGNED FIELDSETS */ + +.aligned label { + display: block; + padding: 4px 10px 0 0; + float: left; + width: 160px; + word-wrap: break-word; + line-height: 1; +} + +.aligned label:not(.vCheckboxLabel):after { + content: ''; + display: inline-block; + vertical-align: middle; + height: 26px; +} + +.aligned label + p, .aligned label + div.help, .aligned label + div.readonly { + padding: 6px 0; + margin-top: 0; + margin-bottom: 0; + margin-left: 170px; +} + +.aligned ul label { + display: inline; + float: none; + width: auto; +} + +.aligned .form-row input { + margin-bottom: 0; +} + +.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { + width: 350px; +} + +form .aligned ul { + margin-left: 160px; + padding-left: 10px; +} + +form .aligned ul.radiolist { + display: inline-block; + margin: 0; + padding: 0; +} + +form .aligned p.help, +form .aligned div.help { + clear: left; + margin-top: 0; + margin-left: 160px; + padding-left: 10px; +} + +form .aligned label + p.help, +form .aligned label + div.help { + margin-left: 0; + padding-left: 0; +} + +form .aligned p.help:last-child, +form .aligned div.help:last-child { + margin-bottom: 0; + padding-bottom: 0; +} + +form .aligned input + p.help, +form .aligned textarea + p.help, +form .aligned select + p.help, +form .aligned input + div.help, +form .aligned textarea + div.help, +form .aligned select + div.help { + margin-left: 160px; + padding-left: 10px; +} + +form .aligned ul li { + list-style: none; +} + +form .aligned table p { + margin-left: 0; + padding-left: 0; +} + +.aligned .vCheckboxLabel { + float: none; + width: auto; + display: inline-block; + vertical-align: -3px; + padding: 0 0 5px 5px; +} + +.aligned .vCheckboxLabel + p.help, +.aligned .vCheckboxLabel + div.help { + margin-top: -4px; +} + +.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { + width: 610px; +} + +.checkbox-row p.help, +.checkbox-row div.help { + margin-left: 0; + padding-left: 0; +} + +fieldset .field-box { + float: left; + margin-right: 20px; +} + +/* WIDE FIELDSETS */ + +.wide label { + width: 200px; +} + +form .wide p, +form .wide input + p.help, +form .wide input + div.help { + margin-left: 200px; +} + +form .wide p.help, +form .wide div.help { + padding-left: 38px; +} + +form div.help ul { + padding-left: 0; + margin-left: 0; +} + +.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { + width: 450px; +} + +/* COLLAPSED FIELDSETS */ + +fieldset.collapsed * { + display: none; +} + +fieldset.collapsed h2, fieldset.collapsed { + display: block; +} + +fieldset.collapsed { + border: 1px solid #eee; + border-radius: 4px; + overflow: hidden; +} + +fieldset.collapsed h2 { + background: #f8f8f8; + color: #666; +} + +fieldset .collapse-toggle { + color: #fff; +} + +fieldset.collapsed .collapse-toggle { + background: transparent; + display: inline; + color: #447e9b; +} + +/* MONOSPACE TEXTAREAS */ + +fieldset.monospace textarea { + font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; +} + +/* SUBMIT ROW */ + +.submit-row { + padding: 12px 14px; + margin: 0 0 20px; + background: #f8f8f8; + border: 1px solid #eee; + border-radius: 4px; + text-align: right; + overflow: hidden; +} + +body.popup .submit-row { + overflow: auto; +} + +.submit-row input { + height: 35px; + line-height: 15px; + margin: 0 0 0 5px; +} + +.submit-row input.default { + margin: 0 0 0 8px; + text-transform: uppercase; +} + +.submit-row p { + margin: 0.3em; +} + +.submit-row p.deletelink-box { + float: left; + margin: 0; +} + +.submit-row a.deletelink { + display: block; + background: #ba2121; + border-radius: 4px; + padding: 10px 15px; + height: 15px; + line-height: 15px; + color: #fff; +} + +.submit-row a.deletelink:focus, +.submit-row a.deletelink:hover, +.submit-row a.deletelink:active { + background: #a41515; +} + +/* CUSTOM FORM FIELDS */ + +.vSelectMultipleField { + vertical-align: top; +} + +.vCheckboxField { + border: none; +} + +.vDateField, .vTimeField { + margin-right: 2px; + margin-bottom: 4px; +} + +.vDateField { + min-width: 6.85em; +} + +.vTimeField { + min-width: 4.7em; +} + +.vURLField { + width: 30em; +} + +.vLargeTextField, .vXMLLargeTextField { + width: 48em; +} + +.flatpages-flatpage #id_content { + height: 40.2em; +} + +.module table .vPositiveSmallIntegerField { + width: 2.2em; +} + +.vTextField { + width: 20em; +} + +.vIntegerField { + width: 5em; +} + +.vBigIntegerField { + width: 10em; +} + +.vForeignKeyRawIdAdminField { + width: 5em; +} + +/* INLINES */ + +.inline-group { + padding: 0; + margin: 0 0 30px; +} + +.inline-group thead th { + padding: 8px 10px; +} + +.inline-group .aligned label { + width: 160px; +} + +.inline-related { + position: relative; +} + +.inline-related h3 { + margin: 0; + color: #666; + padding: 5px; + font-size: 13px; + background: #f8f8f8; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; +} + +.inline-related h3 span.delete { + float: right; +} + +.inline-related h3 span.delete label { + margin-left: 2px; + font-size: 11px; +} + +.inline-related fieldset { + margin: 0; + background: #fff; + border: none; + width: 100%; +} + +.inline-related fieldset.module h3 { + margin: 0; + padding: 2px 5px 3px 5px; + font-size: 11px; + text-align: left; + font-weight: bold; + background: #bcd; + color: #fff; +} + +.inline-group .tabular fieldset.module { + border: none; +} + +.inline-related.tabular fieldset.module table { + width: 100%; +} + +.last-related fieldset { + border: none; +} + +.inline-group .tabular tr.has_original td { + padding-top: 2em; +} + +.inline-group .tabular tr td.original { + padding: 2px 0 0 0; + width: 0; + _position: relative; +} + +.inline-group .tabular th.original { + width: 0px; + padding: 0; +} + +.inline-group .tabular td.original p { + position: absolute; + left: 0; + height: 1.1em; + padding: 2px 9px; + overflow: hidden; + font-size: 9px; + font-weight: bold; + color: #666; + _width: 700px; +} + +.inline-group ul.tools { + padding: 0; + margin: 0; + list-style: none; +} + +.inline-group ul.tools li { + display: inline; + padding: 0 5px; +} + +.inline-group div.add-row, +.inline-group .tabular tr.add-row td { + color: #666; + background: #f8f8f8; + padding: 8px 10px; + border-bottom: 1px solid #eee; +} + +.inline-group .tabular tr.add-row td { + padding: 8px 10px; + border-bottom: 1px solid #eee; +} + +.inline-group ul.tools a.add, +.inline-group div.add-row a, +.inline-group .tabular tr.add-row td a { + background: url(../img/icon-addlink.svg) 0 1px no-repeat; + padding-left: 16px; + font-size: 12px; +} + +.empty-form { + display: none; +} + +/* RELATED FIELD ADD ONE / LOOKUP */ + +.add-another, .related-lookup { + margin-left: 5px; + display: inline-block; + vertical-align: middle; + background-repeat: no-repeat; + background-size: 14px; +} + +.add-another { + width: 16px; + height: 16px; + background-image: url(../img/icon-addlink.svg); +} + +.related-lookup { + width: 16px; + height: 16px; + background-image: url(../img/search.svg); +} + +form .related-widget-wrapper ul { + display: inline-block; + margin-left: 0; + padding-left: 0; +} + +.clearable-file-input input { + margin-top: 0; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/login.css b/venv/Lib/site-packages/simpleui/static/admin/css/login.css new file mode 100644 index 0000000..b9f38ea --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/login.css @@ -0,0 +1,78 @@ +/* LOGIN FORM */ + +body.login { + background: #f8f8f8; +} + +.login #header { + height: auto; + padding: 5px 16px; +} + +.login #header h1 { + font-size: 18px; +} + +.login #header h1 a { + color: #fff; +} + +.login #content { + padding: 20px 20px 0; +} + +.login #container { + background: #fff; + border: 1px solid #eaeaea; + border-radius: 4px; + overflow: hidden; + width: 28em; + min-width: 300px; + margin: 100px auto; +} + +.login #content-main { + width: 100%; +} + +.login .form-row { + padding: 4px 0; + float: left; + width: 100%; + border-bottom: none; +} + +.login .form-row label { + padding-right: 0.5em; + line-height: 2em; + font-size: 1em; + clear: both; + color: #333; +} + +.login .form-row #id_username, .login .form-row #id_password { + clear: both; + padding: 8px; + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.login span.help { + font-size: 10px; + display: block; +} + +.login .submit-row { + clear: both; + padding: 1em 0 0 9.4em; + margin: 0; + border: none; + background: none; + text-align: left; +} + +.login .password-reset-link { + text-align: center; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/responsive.css b/venv/Lib/site-packages/simpleui/static/admin/css/responsive.css new file mode 100644 index 0000000..2b2f76f --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/responsive.css @@ -0,0 +1,964 @@ +/* Tablets */ + +input[type="submit"], button { + -webkit-appearance: none; + appearance: none; +} + +@media (max-width: 1024px) { + /* Basic */ + html { + -webkit-text-size-adjust: 100%; + } + + td, th { + padding: 10px; + font-size: 14px; + } + + .small { + font-size: 12px; + } + + /* Layout */ + #container { + min-width: 0; + } + + #content { + padding: 20px 30px 30px; + } + + div.breadcrumbs { + padding: 10px 30px; + } + + /* Header */ + #header { + display: flex; + flex-direction: column; + padding: 15px 30px; + height: auto; + line-height: 1; + } + + #branding h1 { + margin: 0 0 8px; + font-size: 20px; + line-height: 1.2; + } + + #user-tools { + margin: 0; + font-weight: 400; + line-height: 1.85; + text-align: left; + } + + #user-tools a { + display: inline-block; + line-height: 1.4; + } + + /* Dashboard */ + .dashboard #content { + width: auto; + } + + #content-related { + margin-right: -290px; + } + + .colSM #content-related { + margin-left: -290px; + } + + .colMS { + margin-right: 290px; + } + + .colSM { + margin-left: 290px; + } + + .dashboard .module table td a { + padding-right: 0; + } + + td .changelink, td .addlink { + font-size: 13px; + } + + /* Changelist */ + #changelist #toolbar { + border: none; + padding: 15px; + } + + #changelist-search > div { + display: -webkit-flex; + display: flex; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + max-width: 480px; + } + + #changelist-search label { + line-height: 22px; + } + + #changelist #toolbar form #searchbar { + -webkit-flex: 1 0 auto; + flex: 1 0 auto; + width: 0; + height: 22px; + margin: 0 10px 0 6px; + } + + #changelist-search .quiet { + width: 100%; + margin: 5px 0 0 25px; + } + + #changelist .actions { + display: flex; + flex-wrap: wrap; + padding: 15px 0; + } + + #changelist .actions.selected { + border: none; + } + + #changelist .actions label { + display: flex; + } + + #changelist .actions select { + background: #fff; + } + + #changelist .actions .button { + min-width: 48px; + margin: 0 10px; + } + + #changelist .actions span.all, + #changelist .actions span.clear, + #changelist .actions span.question, + #changelist .actions span.action-counter { + font-size: 11px; + margin: 0 10px 0 0; + } + + #changelist-filter { + width: 200px; + } + + .change-list .filtered .results, + .change-list .filtered .paginator, + .filtered #toolbar, + .filtered .actions, + .filtered div.xfull { + margin-right: 230px; + } + + #changelist .paginator { + border-top-color: #eee; + } + + #changelist .results + .paginator { + border-top: none; + } + + /* Forms */ + label { + font-size: 14px; + } + + .form-row input[type=text], + .form-row input[type=password], + .form-row input[type=email], + .form-row input[type=url], + .form-row input[type=tel], + .form-row input[type=number], + .form-row textarea, + .form-row select, + .form-row .vTextField { + box-sizing: border-box; + margin: 0; + padding: 6px 8px; + min-height: 36px; + font-size: 14px; + } + + .form-row select { + height: 36px; + } + + .form-row select[multiple] { + height: auto; + min-height: 0; + } + + fieldset .field-box { + float: none; + margin: 0 -10px; + padding: 0 10px; + } + + fieldset .field-box + .field-box { + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid #eee; + } + + textarea { + max-width: 518px; + max-height: 120px; + } + + .aligned label { + padding-top: 6px; + } + + .aligned .add-another, + .aligned .related-lookup, + .aligned .datetimeshortcuts, + .aligned .related-lookup + strong { + align-self: center; + margin-left: 15px; + } + + form .aligned ul.radiolist { + margin-left: 2px; + } + + /* Related widget */ + .related-widget-wrapper { + float: none; + } + + .related-widget-wrapper-link + .selector { + max-width: calc(100% - 30px); + margin-right: 15px; + } + + select + .related-widget-wrapper-link, + .related-widget-wrapper-link + .related-widget-wrapper-link { + margin-left: 10px; + } + + /* Selector */ + .selector { + display: flex; + width: 100%; + } + + .selector .selector-filter { + display: flex; + align-items: center; + } + + .selector .selector-filter label { + margin: 0 8px 0 0; + } + + .selector .selector-filter input { + width: auto; + min-height: 0; + flex: 1 1; + } + + .selector-available, .selector-chosen { + width: auto; + flex: 1 1; + display: flex; + flex-direction: column; + } + + .selector select { + width: 100%; + flex: 1 0 auto; + margin-bottom: 5px; + } + + .selector ul.selector-chooser { + width: 26px; + height: 52px; + padding: 2px 0; + margin: auto 15px; + border-radius: 20px; + transform: translateY(-10px); + } + + .selector-add, .selector-remove { + width: 20px; + height: 20px; + background-size: 20px auto; + } + + .selector-add { + background-position: 0 -120px; + } + + .selector-remove { + background-position: 0 -80px; + } + + a.selector-chooseall, a.selector-clearall { + align-self: center; + } + + .stacked { + flex-direction: column; + max-width: 480px; + } + + .stacked > * { + flex: 0 1 auto; + } + + .stacked select { + margin-bottom: 0; + } + + .stacked .selector-available, .stacked .selector-chosen { + width: auto; + } + + .stacked ul.selector-chooser { + width: 52px; + height: 26px; + padding: 0 2px; + margin: 15px auto; + transform: none; + } + + .stacked .selector-chooser li { + padding: 3px; + } + + .stacked .selector-add, .stacked .selector-remove { + background-size: 20px auto; + } + + .stacked .selector-add { + background-position: 0 -40px; + } + + .stacked .active.selector-add { + background-position: 0 -60px; + } + + .stacked .selector-remove { + background-position: 0 0; + } + + .stacked .active.selector-remove { + background-position: 0 -20px; + } + + .help-tooltip, .selector .help-icon { + display: none; + } + + form .form-row p.datetime { + width: 100%; + } + + .datetime input { + width: 50%; + max-width: 120px; + } + + .datetime span { + font-size: 13px; + } + + .datetime .timezonewarning { + display: block; + font-size: 11px; + color: #999; + } + + .datetimeshortcuts { + color: #ccc; + } + + .inline-group { + overflow: auto; + } + + /* Messages */ + ul.messagelist li { + padding-left: 55px; + background-position: 30px 12px; + } + + ul.messagelist li.error { + background-position: 30px 12px; + } + + ul.messagelist li.warning { + background-position: 30px 14px; + } + + /* Login */ + .login #header { + padding: 15px 20px; + } + + .login #branding h1 { + margin: 0; + } + + /* GIS */ + div.olMap { + max-width: calc(100vw - 30px); + max-height: 300px; + } + + .olMap + .clear_features { + display: block; + margin-top: 10px; + } + + /* Docs */ + .module table.xfull { + width: 100%; + } + + pre.literal-block { + overflow: auto; + } +} + +/* Mobile */ + +@media (max-width: 767px) { + /* Layout */ + #header, #content, #footer { + padding: 15px; + } + + #footer:empty { + padding: 0; + } + + div.breadcrumbs { + padding: 10px 15px; + } + + /* Dashboard */ + .colMS, .colSM { + margin: 0; + } + + #content-related, .colSM #content-related { + width: 100%; + margin: 0; + } + + #content-related .module { + margin-bottom: 0; + } + + #content-related .module h2 { + padding: 10px 15px; + font-size: 16px; + } + + /* Changelist */ + #changelist { + display: flex; + flex-direction: column; + } + + #changelist #toolbar { + order: 1; + padding: 10px; + } + + #changelist .xfull { + order: 2; + } + + #changelist-form { + order: 3; + } + + #changelist-filter { + order: 4; + } + + #changelist .actions label { + flex: 1 1; + } + + #changelist .actions select { + flex: 1 0; + width: 100%; + } + + #changelist .actions span { + flex: 1 0 100%; + } + + .change-list .filtered .results, .change-list .filtered .paginator, + .filtered #toolbar, .filtered .actions, .filtered div.xfull { + margin-right: 0; + } + + #changelist-filter { + position: static; + width: auto; + margin-top: 30px; + } + + .object-tools { + float: none; + margin: 0 0 15px; + padding: 0; + overflow: hidden; + } + + .object-tools li { + height: auto; + margin-left: 0; + } + + .object-tools li + li { + margin-left: 15px; + } + + /* Forms */ + .form-row { + padding: 15px 0; + } + + .aligned .form-row, + .aligned .form-row > div { + display: flex; + flex-wrap: wrap; + max-width: 100vw; + } + + .aligned .form-row > div { + width: calc(100vw - 30px); + } + + textarea { + max-width: none; + } + + .vURLField { + width: auto; + } + + fieldset .field-box + .field-box { + margin-top: 15px; + padding-top: 15px; + } + + fieldset.collapsed .form-row { + display: none; + } + + .aligned label { + width: 100%; + padding: 0 0 10px; + } + + .aligned label:after { + max-height: 0; + } + + .aligned .form-row input, + .aligned .form-row select, + .aligned .form-row textarea { + flex: 1 1 auto; + max-width: 100%; + } + + .aligned .checkbox-row { + align-items: center; + } + + .aligned .checkbox-row input { + flex: 0 1 auto; + margin: 0; + } + + .aligned .vCheckboxLabel { + flex: 1 0; + padding: 1px 0 0 5px; + } + + .aligned label + p, + .aligned label + div.help, + .aligned label + div.readonly { + padding: 0; + margin-left: 0; + } + + .aligned p.file-upload { + margin-left: 0; + font-size: 13px; + } + + span.clearable-file-input { + margin-left: 15px; + } + + span.clearable-file-input label { + font-size: 13px; + padding-bottom: 0; + } + + .aligned .timezonewarning { + flex: 1 0 100%; + margin-top: 5px; + } + + form .aligned .form-row div.help { + width: 100%; + margin: 5px 0 0; + padding: 0; + } + + form .aligned ul { + margin-left: 0; + padding-left: 0; + } + + form .aligned ul.radiolist { + margin-right: 15px; + margin-bottom: -3px; + } + + form .aligned ul.radiolist li + li { + margin-top: 5px; + } + + /* Related widget */ + .related-widget-wrapper { + width: 100%; + display: flex; + align-items: flex-start; + } + + .related-widget-wrapper .selector { + order: 1; + } + + .related-widget-wrapper > a { + order: 2; + } + + .related-widget-wrapper .radiolist ~ a { + align-self: flex-end; + } + + .related-widget-wrapper > select ~ a { + align-self: center; + } + + select + .related-widget-wrapper-link, + .related-widget-wrapper-link + .related-widget-wrapper-link { + margin-left: 15px; + } + + /* Selector */ + .selector { + flex-direction: column; + } + + .selector > * { + float: none; + } + + .selector-available, .selector-chosen { + margin-bottom: 0; + flex: 1 1 auto; + } + + .selector select { + max-height: 96px; + } + + .selector ul.selector-chooser { + display: block; + float: none; + width: 52px; + height: 26px; + padding: 0 2px; + margin: 15px auto 20px; + transform: none; + } + + .selector ul.selector-chooser li { + float: left; + } + + .selector-remove { + background-position: 0 0; + } + + .selector-add { + background-position: 0 -40px; + } + + /* Inlines */ + .inline-group[data-inline-type="stacked"] .inline-related { + border: 2px solid #eee; + border-radius: 4px; + margin-top: 15px; + overflow: auto; + } + + .inline-group[data-inline-type="stacked"] .inline-related > * { + box-sizing: border-box; + } + + .inline-group[data-inline-type="stacked"] .inline-related + .inline-related { + margin-top: 30px; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module { + padding: 0 10px; + } + + .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:last-child { + border-bottom: none; + } + + .inline-group[data-inline-type="stacked"] .inline-related h3 { + padding: 10px; + border-top-width: 0; + border-bottom-width: 2px; + display: flex; + flex-wrap: wrap; + align-items: center; + } + + .inline-group[data-inline-type="stacked"] .inline-related h3 .inline_label { + margin-right: auto; + } + + .inline-group[data-inline-type="stacked"] .inline-related h3 span.delete { + float: none; + flex: 1 1 100%; + margin-top: 5px; + } + + .inline-group[data-inline-type="stacked"] .aligned .form-row > div:not([class]) { + width: 100%; + } + + .inline-group[data-inline-type="stacked"] .aligned label { + width: 100%; + } + + .inline-group[data-inline-type="stacked"] div.add-row { + margin-top: 15px; + border: 1px solid #eee; + border-radius: 4px; + } + + .inline-group div.add-row, + .inline-group .tabular tr.add-row td { + padding: 0; + } + + .inline-group div.add-row a, + .inline-group .tabular tr.add-row td a { + display: block; + padding: 8px 10px 8px 26px; + background-position: 8px 9px; + } + + /* Submit row */ + .submit-row { + padding: 10px 10px 0; + margin: 0 0 15px; + display: flex; + flex-direction: column; + } + + .submit-row > * { + width: 100%; + } + + .submit-row input, .submit-row input.default, .submit-row a { + float: none; + margin: 0 0 10px; + text-align: center; + } + + .submit-row p.deletelink-box { + order: 4; + } + + /* Messages */ + ul.messagelist li { + padding-left: 40px; + background-position: 15px 12px; + } + + ul.messagelist li.error { + background-position: 15px 12px; + } + + ul.messagelist li.warning { + background-position: 15px 14px; + } + + /* Paginator */ + .paginator .this-page, .paginator a:link, .paginator a:visited { + padding: 4px 10px; + } + + /* Login */ + body.login { + padding: 0 15px; + } + + .login #container { + width: auto; + max-width: 480px; + margin: 50px auto; + } + + .login #header, + .login #content { + padding: 15px; + } + + .login #content-main { + float: none; + } + + .login .form-row { + padding: 0; + } + + .login .form-row + .form-row { + margin-top: 15px; + } + + .login .form-row label { + display: block; + margin: 0 0 5px; + padding: 0; + line-height: 1.2; + } + + .login .submit-row { + padding: 15px 0 0; + } + + .login br, .login .submit-row label { + display: none; + } + + .login .submit-row input { + margin: 0; + text-transform: uppercase; + } + + .errornote { + margin: 0 0 20px; + padding: 8px 12px; + font-size: 13px; + } + + /* Calendar and clock */ + .calendarbox, .clockbox { + position: fixed !important; + top: 50% !important; + left: 50% !important; + transform: translate(-50%, -50%); + margin: 0; + border: none; + overflow: visible; + } + + .calendarbox:before, .clockbox:before { + content: ''; + position: fixed; + top: 50%; + left: 50%; + width: 100vw; + height: 100vh; + background: rgba(0, 0, 0, 0.75); + transform: translate(-50%, -50%); + } + + .calendarbox > *, .clockbox > * { + position: relative; + z-index: 1; + } + + .calendarbox > div:first-child { + z-index: 2; + } + + .calendarbox .calendar, .clockbox h2 { + border-radius: 4px 4px 0 0; + overflow: hidden; + } + + .calendarbox .calendar-cancel, .clockbox .calendar-cancel { + border-radius: 0 0 4px 4px; + overflow: hidden; + } + + .calendar-shortcuts { + padding: 10px 0; + font-size: 12px; + line-height: 12px; + } + + .calendar-shortcuts a { + margin: 0 4px; + } + + .timelist a { + background: #fff; + padding: 4px; + } + + .calendar-cancel { + padding: 8px 10px; + } + + .clockbox h2 { + padding: 8px 15px; + } + + .calendar caption { + padding: 10px; + } + + .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { + z-index: 1; + top: 10px; + } + + /* History */ + table#change-history tbody th, table#change-history tbody td { + font-size: 13px; + word-break: break-word; + } + + table#change-history tbody th { + width: auto; + } + + /* Docs */ + table.model tbody th, table.model tbody td { + font-size: 13px; + word-break: break-word; + } +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/responsive_rtl.css b/venv/Lib/site-packages/simpleui/static/admin/css/responsive_rtl.css new file mode 100644 index 0000000..aaffa91 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/responsive_rtl.css @@ -0,0 +1,80 @@ +/* TABLETS */ + +@media (max-width: 1024px) { + [dir="rtl"] .colMS { + margin-right: 0; + } + + [dir="rtl"] #user-tools { + text-align: right; + } + + [dir="rtl"] #changelist .actions label { + padding-left: 10px; + padding-right: 0; + } + + [dir="rtl"] #changelist .actions select { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .change-list .filtered .results, + [dir="rtl"] .change-list .filtered .paginator, + [dir="rtl"] .filtered #toolbar, + [dir="rtl"] .filtered div.xfull, + [dir="rtl"] .filtered .actions { + margin-right: 0; + margin-left: 230px; + } + + [dir="rtl"] .inline-group ul.tools a.add, + [dir="rtl"] .inline-group div.add-row a, + [dir="rtl"] .inline-group .tabular tr.add-row td a { + padding: 8px 26px 8px 10px; + background-position: calc(100% - 8px) 9px; + } + + [dir="rtl"] .related-widget-wrapper-link + .selector { + margin-right: 0; + margin-left: 15px; + } + + [dir="rtl"] .selector .selector-filter label { + margin-right: 0; + margin-left: 8px; + } + + [dir="rtl"] .object-tools li { + float: right; + } + + [dir="rtl"] .object-tools li + li { + margin-left: 0; + margin-right: 15px; + } + + [dir="rtl"] .dashboard .module table td a { + padding-left: 0; + padding-right: 16px; + } +} + +/* MOBILE */ + +@media (max-width: 767px) { + [dir="rtl"] .change-list .filtered .results, + [dir="rtl"] .change-list .filtered .paginator, + [dir="rtl"] .filtered #toolbar, + [dir="rtl"] .filtered div.xfull, + [dir="rtl"] .filtered .actions { + margin-left: 0; + } + + [dir="rtl"] .aligned .add-another, + [dir="rtl"] .aligned .related-lookup, + [dir="rtl"] .aligned .datetimeshortcuts { + margin-left: 0; + margin-right: 15px; + } +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/rtl.css b/venv/Lib/site-packages/simpleui/static/admin/css/rtl.css new file mode 100644 index 0000000..542cddb --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/rtl.css @@ -0,0 +1,264 @@ +body { + direction: rtl; +} + +/* LOGIN */ + +.login .form-row { + float: right; +} + +.login .form-row label { + float: right; + padding-left: 0.5em; + padding-right: 0; + text-align: left; +} + +.login .submit-row { + clear: both; + padding: 1em 9.4em 0 0; +} + +/* GLOBAL */ + +th { + text-align: right; +} + +.module h2, .module caption { + text-align: right; +} + +.module ul, .module ol { + margin-left: 0; + margin-right: 1.5em; +} + +.addlink, .changelink { + padding-left: 0; + padding-right: 16px; + background-position: 100% 1px; +} + +.deletelink { + padding-left: 0; + padding-right: 16px; + background-position: 100% 1px; +} + +.object-tools { + float: left; +} + +thead th:first-child, +tfoot td:first-child { + border-left: none; +} + +/* LAYOUT */ + +#user-tools { + right: auto; + left: 0; + text-align: left; +} + +div.breadcrumbs { + text-align: right; +} + +#content-main { + float: right; +} + +#content-related { + float: left; + margin-left: -300px; + margin-right: auto; +} + +.colMS { + margin-left: 300px; + margin-right: 0; +} + +/* SORTABLE TABLES */ + +table thead th.sorted .sortoptions { + float: left; +} + +thead th.sorted .text { + padding-right: 0; + padding-left: 42px; +} + +/* dashboard styles */ + +.dashboard .module table td a { + padding-left: .6em; + padding-right: 16px; +} + +/* changelists styles */ + +.change-list .filtered table { + border-left: none; + border-right: 0px none; +} + +#changelist-filter { + right: auto; + left: 0; + border-left: none; + border-right: none; +} + +.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { + margin-right: 0; + margin-left: 280px; +} + +#changelist-filter li.selected { + border-left: none; + padding-left: 10px; + margin-left: 0; + border-right: 5px solid #eaeaea; + padding-right: 10px; + margin-right: -15px; +} + +.filtered .actions { + margin-left: 280px; + margin-right: 0; +} + +#changelist table tbody td:first-child, #changelist table tbody th:first-child { + border-right: none; + border-left: none; +} + +/* FORMS */ + +.aligned label { + padding: 0 0 3px 1em; + float: right; +} + +.submit-row { + text-align: left +} + +.submit-row p.deletelink-box { + float: right; +} + +.submit-row input.default { + margin-left: 0; +} + +.vDateField, .vTimeField { + margin-left: 2px; +} + +.aligned .form-row input { + margin-left: 5px; +} + +form .aligned p.help, form .aligned div.help { + clear: right; +} + +form ul.inline li { + float: right; + padding-right: 0; + padding-left: 7px; +} + +input[type=submit].default, .submit-row input.default { + float: left; +} + +fieldset .field-box { + float: right; + margin-left: 20px; + margin-right: 0; +} + +.errorlist li { + background-position: 100% 12px; + padding: 0; +} + +.errornote { + background-position: 100% 12px; + padding: 10px 12px; +} + +/* WIDGETS */ + +.calendarnav-previous { + top: 0; + left: auto; + right: 10px; +} + +.calendarnav-next { + top: 0; + right: auto; + left: 10px; +} + +.calendar caption, .calendarbox h2 { + text-align: center; +} + +.selector { + float: right; +} + +.selector .selector-filter { + text-align: right; +} + +.inline-deletelink { + float: left; +} + +form .form-row p.datetime { + overflow: hidden; +} + +.related-widget-wrapper { + float: right; +} + +/* MISC */ + +.inline-related h2, .inline-group h2 { + text-align: right +} + +.inline-related h3 span.delete { + padding-right: 20px; + padding-left: inherit; + left: 10px; + right: inherit; + float: left; +} + +.inline-related h3 span.delete label { + margin-left: inherit; + margin-right: 2px; +} + +/* IE7 specific bug fixes */ + +div.colM { + position: relative; +} + +.submit-row input { + float: left; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/ui.css b/venv/Lib/site-packages/simpleui/static/admin/css/ui.css new file mode 100644 index 0000000..4186053 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/ui.css @@ -0,0 +1,17 @@ +body { + margin: 0; + padding: 0; +} + +.errornote { + font-size: 14px; + font-weight: 700; + display: block; + padding: 10px 12px; + margin: 0 0 10px 0; + color: #ba2121; + border: 1px solid #ba2121; + border-radius: 4px; + background-color: #fff; + background-position: 5px 12px; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/LICENSE-SELECT2.md b/venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/LICENSE-SELECT2.md new file mode 100644 index 0000000..86c7c29 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/LICENSE-SELECT2.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/select2.css b/venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/select2.css new file mode 100644 index 0000000..f1e5cdb --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/select2.css @@ -0,0 +1,634 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; +} + +.select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; +} + +.select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.select2-container .select2-selection--single .select2-selection__clear { + position: relative; +} + +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; +} + +.select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; +} + +.select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.select2-container .select2-search--inline { + float: left; +} + +.select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; +} + +.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; +} + +.select2-results { + display: block; +} + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; +} + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; +} + +.select2-results__option[aria-selected] { + cursor: pointer; +} + +.select2-container--open .select2-dropdown { + left: 0; +} + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-search--dropdown { + display: block; + padding: 4px; +} + +.select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; +} + +.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.select2-search--dropdown.select2-search--hide { + display: none; +} + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); +} + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; +} + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; +} + +.select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; +} + +.select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; +} + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; +} + +.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; +} + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; +} + +.select2-container--default .select2-selection--multiple .select2-selection__placeholder { + color: #999; + margin-top: 5px; + float: left; +} + +.select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; +} + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; +} + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; +} + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; +} + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; +} + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--default .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; +} + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; +} + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); +} + +.select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; +} + +.select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; +} + +.select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; +} + +.select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; +} + +.select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); +} + +.select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; +} + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; +} + +.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; +} + +.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); +} + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; +} + +.select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; +} + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; +} + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; +} + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; +} + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; +} + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; +} + +.select2-container--classic .select2-dropdown--below { + border-top: none; +} + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; +} + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; +} + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/select2.min.css b/venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/select2.min.css new file mode 100644 index 0000000..76de04d --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/vendor/select2/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/venv/Lib/site-packages/simpleui/static/admin/css/widgets.css b/venv/Lib/site-packages/simpleui/static/admin/css/widgets.css new file mode 100644 index 0000000..d71b7c7 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/css/widgets.css @@ -0,0 +1,565 @@ +/* SELECTOR (FILTER INTERFACE) */ + +.selector { + width: 800px; + float: left; +} + +.selector select { + width: 380px; + height: 17.2em; +} + +.selector-available, .selector-chosen { + float: left; + width: 380px; + text-align: center; + margin-bottom: 5px; +} + +.selector-chosen select { + border-top: none; +} + +.selector-available h2, .selector-chosen h2 { + border: 1px solid #ccc; + border-radius: 4px 4px 0 0; +} + +.selector-chosen h2 { + background: #79aec8; + color: #fff; +} + +.selector .selector-available h2 { + background: #f8f8f8; + color: #666; +} + +.selector .selector-filter { + background: white; + border: 1px solid #ccc; + border-width: 0 1px; + padding: 8px; + color: #999; + font-size: 10px; + margin: 0; + text-align: left; +} + +.selector .selector-filter label, +.inline-group .aligned .selector .selector-filter label { + float: left; + margin: 7px 0 0; + width: 18px; + height: 18px; + padding: 0; + overflow: hidden; + line-height: 1; +} + +.selector .selector-available input { + width: 320px; + margin-left: 8px; +} + +.selector ul.selector-chooser { + float: left; + width: 22px; + background-color: #eee; + border-radius: 10px; + margin: 10em 5px 0 5px; + padding: 0; +} + +.selector-chooser li { + margin: 0; + padding: 3px; + list-style-type: none; +} + +.selector select { + padding: 0 10px; + margin: 0 0 10px; + border-radius: 0 0 4px 4px; +} + +.selector-add, .selector-remove { + width: 16px; + height: 16px; + display: block; + text-indent: -3000px; + overflow: hidden; + cursor: default; + opacity: 0.3; +} + +.active.selector-add, .active.selector-remove { + opacity: 1; +} + +.active.selector-add:hover, .active.selector-remove:hover { + cursor: pointer; +} + +.selector-add { + background: url(../img/selector-icons.svg) 0 -96px no-repeat; +} + +.active.selector-add:focus, .active.selector-add:hover { + background-position: 0 -112px; +} + +.selector-remove { + background: url(../img/selector-icons.svg) 0 -64px no-repeat; +} + +.active.selector-remove:focus, .active.selector-remove:hover { + background-position: 0 -80px; +} + +a.selector-chooseall, a.selector-clearall { + display: inline-block; + height: 16px; + text-align: left; + margin: 1px auto 3px; + overflow: hidden; + font-weight: bold; + line-height: 16px; + color: #666; + text-decoration: none; + opacity: 0.3; +} + +a.active.selector-chooseall:focus, a.active.selector-clearall:focus, +a.active.selector-chooseall:hover, a.active.selector-clearall:hover { + color: #447e9b; +} + +a.active.selector-chooseall, a.active.selector-clearall { + opacity: 1; +} + +a.active.selector-chooseall:hover, a.active.selector-clearall:hover { + cursor: pointer; +} + +a.selector-chooseall { + padding: 0 18px 0 0; + background: url(../img/selector-icons.svg) right -160px no-repeat; + cursor: default; +} + +a.active.selector-chooseall:focus, a.active.selector-chooseall:hover { + background-position: 100% -176px; +} + +a.selector-clearall { + padding: 0 0 0 18px; + background: url(../img/selector-icons.svg) 0 -128px no-repeat; + cursor: default; +} + +a.active.selector-clearall:focus, a.active.selector-clearall:hover { + background-position: 0 -144px; +} + +/* STACKED SELECTORS */ + +.stacked { + float: left; + width: 490px; +} + +.stacked select { + width: 480px; + height: 10.1em; +} + +.stacked .selector-available, .stacked .selector-chosen { + width: 480px; +} + +.stacked .selector-available { + margin-bottom: 0; +} + +.stacked .selector-available input { + width: 422px; +} + +.stacked ul.selector-chooser { + height: 22px; + width: 50px; + margin: 0 0 10px 40%; + background-color: #eee; + border-radius: 10px; +} + +.stacked .selector-chooser li { + float: left; + padding: 3px 3px 3px 5px; +} + +.stacked .selector-chooseall, .stacked .selector-clearall { + display: none; +} + +.stacked .selector-add { + background: url(../img/selector-icons.svg) 0 -32px no-repeat; + cursor: default; +} + +.stacked .active.selector-add { + background-position: 0 -48px; + cursor: pointer; +} + +.stacked .selector-remove { + background: url(../img/selector-icons.svg) 0 0 no-repeat; + cursor: default; +} + +.stacked .active.selector-remove { + background-position: 0 -16px; + cursor: pointer; +} + +.selector .help-icon { + background: url(../img/icon-unknown.svg) 0 0 no-repeat; + display: inline-block; + vertical-align: middle; + margin: -2px 0 0 2px; + width: 13px; + height: 13px; +} + +.selector .selector-chosen .help-icon { + background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; +} + +.selector .search-label-icon { + background: url(../img/search.svg) 0 0 no-repeat; + display: inline-block; + height: 18px; + width: 18px; +} + +/* DATE AND TIME */ + +p.datetime { + line-height: 20px; + margin: 0; + padding: 0; + color: #666; + font-weight: bold; +} + +.datetime span { + white-space: nowrap; + font-weight: normal; + font-size: 11px; + color: #ccc; +} + +.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { + min-width: 0; + margin-left: 5px; + margin-bottom: 4px; +} + +table p.datetime { + font-size: 11px; + margin-left: 0; + padding-left: 0; +} + +.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { + position: relative; + display: inline-block; + vertical-align: middle; + height: 16px; + width: 16px; + overflow: hidden; +} + +.datetimeshortcuts .clock-icon { + background: url(../img/icon-clock.svg) 0 0 no-repeat; +} + +.datetimeshortcuts a:focus .clock-icon, +.datetimeshortcuts a:hover .clock-icon { + background-position: 0 -16px; +} + +.datetimeshortcuts .date-icon { + background: url(../img/icon-calendar.svg) 0 0 no-repeat; + top: -1px; +} + +.datetimeshortcuts a:focus .date-icon, +.datetimeshortcuts a:hover .date-icon { + background-position: 0 -16px; +} + +.timezonewarning { + font-size: 11px; + color: #999; +} + +/* URL */ + +p.url { + line-height: 20px; + margin: 0; + padding: 0; + color: #666; + font-size: 11px; + font-weight: bold; +} + +.url a { + font-weight: normal; +} + +/* FILE UPLOADS */ + +p.file-upload { + line-height: 20px; + margin: 0; + padding: 0; + color: #666; + font-size: 11px; + font-weight: bold; +} + +.aligned p.file-upload { + margin-left: 170px; +} + +.file-upload a { + font-weight: normal; +} + +.file-upload .deletelink { + margin-left: 5px; +} + +span.clearable-file-input label { + color: #333; + font-size: 11px; + display: inline; + float: none; +} + +/* CALENDARS & CLOCKS */ + +.calendarbox, .clockbox { + margin: 5px auto; + font-size: 12px; + width: 19em; + text-align: center; + background: white; + border: 1px solid #ddd; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); + overflow: hidden; + position: relative; +} + +.clockbox { + width: auto; +} + +.calendar { + margin: 0; + padding: 0; +} + +.calendar table { + margin: 0; + padding: 0; + border-collapse: collapse; + background: white; + width: 100%; +} + +.calendar caption, .calendarbox h2 { + margin: 0; + text-align: center; + border-top: none; + background: #f5dd5d; + font-weight: 700; + font-size: 12px; + color: #333; +} + +.calendar th { + padding: 8px 5px; + background: #f8f8f8; + border-bottom: 1px solid #ddd; + font-weight: 400; + font-size: 12px; + text-align: center; + color: #666; +} + +.calendar td { + font-weight: 400; + font-size: 12px; + text-align: center; + padding: 0; + border-top: 1px solid #eee; + border-bottom: none; +} + +.calendar td.selected a { + background: #79aec8; + color: #fff; +} + +.calendar td.nonday { + background: #f8f8f8; +} + +.calendar td.today a { + font-weight: 700; +} + +.calendar td a, .timelist a { + display: block; + font-weight: 400; + padding: 6px; + text-decoration: none; + color: #444; +} + +.calendar td a:focus, .timelist a:focus, +.calendar td a:hover, .timelist a:hover { + background: #79aec8; + color: white; +} + +.calendar td a:active, .timelist a:active { + background: #417690; + color: white; +} + +.calendarnav { + font-size: 10px; + text-align: center; + color: #ccc; + margin: 0; + padding: 1px 3px; +} + +.calendarnav a:link, #calendarnav a:visited, +#calendarnav a:focus, #calendarnav a:hover { + color: #999; +} + +.calendar-shortcuts { + background: white; + font-size: 11px; + line-height: 11px; + border-top: 1px solid #eee; + padding: 8px 0; + color: #ccc; +} + +.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { + display: block; + position: absolute; + top: 8px; + width: 15px; + height: 15px; + text-indent: -9999px; + padding: 0; +} + +.calendarnav-previous { + left: 10px; + background: url(../img/calendar-icons.svg) 0 0 no-repeat; +} + +.calendarbox .calendarnav-previous:focus, +.calendarbox .calendarnav-previous:hover { + background-position: 0 -15px; +} + +.calendarnav-next { + right: 10px; + background: url(../img/calendar-icons.svg) 0 -30px no-repeat; +} + +.calendarbox .calendarnav-next:focus, +.calendarbox .calendarnav-next:hover { + background-position: 0 -45px; +} + +.calendar-cancel { + margin: 0; + padding: 4px 0; + font-size: 12px; + background: #eee; + border-top: 1px solid #ddd; + color: #333; +} + +.calendar-cancel:focus, .calendar-cancel:hover { + background: #ddd; +} + +.calendar-cancel a { + color: black; + display: block; +} + +ul.timelist, .timelist li { + list-style-type: none; + margin: 0; + padding: 0; +} + +.timelist a { + padding: 2px; +} + +/* EDIT INLINE */ + +.inline-deletelink { + float: right; + text-indent: -9999px; + background: url(../img/inline-delete.svg) 0 0 no-repeat; + width: 16px; + height: 16px; + border: 0px none; +} + +.inline-deletelink:focus, .inline-deletelink:hover { + cursor: pointer; +} + +/* RELATED WIDGET WRAPPER */ +.related-widget-wrapper { + float: left; /* display properly in form rows with multiple fields */ + overflow: hidden; /* clear floated contents */ +} + +.related-widget-wrapper-link { + opacity: 0.3; +} + +.related-widget-wrapper-link:link { + opacity: .8; +} + +.related-widget-wrapper-link:link:focus, +.related-widget-wrapper-link:link:hover { + opacity: 1; +} + +select + .related-widget-wrapper-link, +.related-widget-wrapper-link + .related-widget-wrapper-link { + margin-left: 7px; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/fonts/LICENSE.txt b/venv/Lib/site-packages/simpleui/static/admin/fonts/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/venv/Lib/site-packages/simpleui/static/admin/fonts/README.txt b/venv/Lib/site-packages/simpleui/static/admin/fonts/README.txt new file mode 100644 index 0000000..cc2135a --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/fonts/README.txt @@ -0,0 +1,2 @@ +Roboto webfont source: https://www.google.com/fonts/specimen/Roboto +Weights used in this project: Light (300), Regular (400), Bold (700) diff --git a/venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Bold-webfont.woff b/venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Bold-webfont.woff new file mode 100644 index 0000000..03357ce Binary files /dev/null and b/venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Bold-webfont.woff differ diff --git a/venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Light-webfont.woff b/venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Light-webfont.woff new file mode 100644 index 0000000..f6abd87 Binary files /dev/null and b/venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Light-webfont.woff differ diff --git a/venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Regular-webfont.woff b/venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Regular-webfont.woff new file mode 100644 index 0000000..6ff6afd Binary files /dev/null and b/venv/Lib/site-packages/simpleui/static/admin/fonts/Roboto-Regular-webfont.woff differ diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/LICENSE b/venv/Lib/site-packages/simpleui/static/admin/img/LICENSE new file mode 100644 index 0000000..a4faaa1 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Code Charm Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/README.txt b/venv/Lib/site-packages/simpleui/static/admin/img/README.txt new file mode 100644 index 0000000..43373ad --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/README.txt @@ -0,0 +1,7 @@ +All icons are taken from Font Awesome (http://fontawesome.io/) project. +The Font Awesome font is licensed under the SIL OFL 1.1: +- http://scripts.sil.org/OFL + +SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG +Font-Awesome-SVG-PNG is licensed under the MIT license (see file license +in current folder). diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/calendar-icons.svg b/venv/Lib/site-packages/simpleui/static/admin/img/calendar-icons.svg new file mode 100644 index 0000000..48cc42d --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/calendar-icons.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/gis/move_vertex_off.svg b/venv/Lib/site-packages/simpleui/static/admin/img/gis/move_vertex_off.svg new file mode 100644 index 0000000..c91607e --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/gis/move_vertex_off.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/gis/move_vertex_on.svg b/venv/Lib/site-packages/simpleui/static/admin/img/gis/move_vertex_on.svg new file mode 100644 index 0000000..2db86f4 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/gis/move_vertex_on.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-addlink.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-addlink.svg new file mode 100644 index 0000000..fca87f8 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-addlink.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-alert.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-alert.svg new file mode 100644 index 0000000..9304e25 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-alert.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-calendar.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-calendar.svg new file mode 100644 index 0000000..21261d2 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-calendar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-changelink.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-changelink.svg new file mode 100644 index 0000000..dcb6f1c --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-changelink.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-clock.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-clock.svg new file mode 100644 index 0000000..a695309 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-clock.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-deletelink.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-deletelink.svg new file mode 100644 index 0000000..f041cb3 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-deletelink.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-no.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-no.svg new file mode 100644 index 0000000..09cc65c --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-no.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-unknown-alt.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-unknown-alt.svg new file mode 100644 index 0000000..f7620c5 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-unknown-alt.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-unknown.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-unknown.svg new file mode 100644 index 0000000..798eb61 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-unknown.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/icon-yes.svg b/venv/Lib/site-packages/simpleui/static/admin/img/icon-yes.svg new file mode 100644 index 0000000..7744238 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/icon-yes.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/inline-delete.svg b/venv/Lib/site-packages/simpleui/static/admin/img/inline-delete.svg new file mode 100644 index 0000000..468dcb7 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/inline-delete.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/search.svg b/venv/Lib/site-packages/simpleui/static/admin/img/search.svg new file mode 100644 index 0000000..244989e --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/search.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/selector-icons.svg b/venv/Lib/site-packages/simpleui/static/admin/img/selector-icons.svg new file mode 100644 index 0000000..a725d62 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/selector-icons.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/sorting-icons.svg b/venv/Lib/site-packages/simpleui/static/admin/img/sorting-icons.svg new file mode 100644 index 0000000..0e0213d --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/sorting-icons.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/tooltag-add.svg b/venv/Lib/site-packages/simpleui/static/admin/img/tooltag-add.svg new file mode 100644 index 0000000..22aaa61 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/tooltag-add.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/img/tooltag-arrowright.svg b/venv/Lib/site-packages/simpleui/static/admin/img/tooltag-arrowright.svg new file mode 100644 index 0000000..6c9f686 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/img/tooltag-arrowright.svg @@ -0,0 +1,4 @@ + + + diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/SelectBox.js b/venv/Lib/site-packages/simpleui/static/admin/js/SelectBox.js new file mode 100644 index 0000000..002b39d --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/SelectBox.js @@ -0,0 +1,143 @@ +(function ($) { + 'use strict'; + var SelectBox = { + cache: {}, + init: function (id) { + var box = document.getElementById(id); + var node; + SelectBox.cache[id] = []; + var cache = SelectBox.cache[id]; + var boxOptions = box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0, j = boxOptionsLength; i < j; i++) { + node = boxOptions[i]; + cache.push({value: node.value, text: node.text, displayed: 1}); + } + }, + redisplay: function (id) { + // Repopulate HTML select box from cache + var box = document.getElementById(id); + var node; + $(box).empty(); // clear all options + var new_options = box.outerHTML.slice(0, -9); // grab just the opening tag + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + if (node.displayed) { + var new_option = new Option(node.text, node.value, false, false); + // Shows a tooltip when hovering over the option + new_option.setAttribute("title", node.text); + new_options += new_option.outerHTML; + } + } + new_options += ''; + box.outerHTML = new_options; + }, + filter: function (id, text) { + // Redisplay the HTML select box, displaying only the choices containing ALL + // the words in text. (It's an AND search.) + var tokens = text.toLowerCase().split(/\s+/); + var node, token; + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + node.displayed = 1; + var node_text = node.text.toLowerCase(); + var numTokens = tokens.length; + for (var k = 0; k < numTokens; k++) { + token = tokens[k]; + if (node_text.indexOf(token) === -1) { + node.displayed = 0; + break; // Once the first token isn't found we're done + } + } + } + SelectBox.redisplay(id); + }, + delete_from_cache: function (id, value) { + var node, delete_index = null; + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + if (node.value === value) { + delete_index = i; + break; + } + } + cache.splice(delete_index, 1); + }, + add_to_cache: function (id, option) { + SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); + }, + cache_contains: function (id, value) { + // Check if an item is contained in the cache + var node; + var cache = SelectBox.cache[id]; + for (var i = 0, j = cache.length; i < j; i++) { + node = cache[i]; + if (node.value === value) { + return true; + } + } + return false; + }, + move: function (from, to) { + var from_box = document.getElementById(from); + var option; + var boxOptions = from_box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0, j = boxOptionsLength; i < j; i++) { + option = boxOptions[i]; + var option_value = option.value; + if (option.selected && SelectBox.cache_contains(from, option_value)) { + SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); + SelectBox.delete_from_cache(from, option_value); + } + } + SelectBox.redisplay(from); + SelectBox.redisplay(to); + }, + move_all: function (from, to) { + var from_box = document.getElementById(from); + var option; + var boxOptions = from_box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0, j = boxOptionsLength; i < j; i++) { + option = boxOptions[i]; + var option_value = option.value; + if (SelectBox.cache_contains(from, option_value)) { + SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); + SelectBox.delete_from_cache(from, option_value); + } + } + SelectBox.redisplay(from); + SelectBox.redisplay(to); + }, + sort: function (id) { + SelectBox.cache[id].sort(function (a, b) { + a = a.text.toLowerCase(); + b = b.text.toLowerCase(); + try { + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + } catch (e) { + // silently fail on IE 'unknown' exception + } + return 0; + }); + }, + select_all: function (id) { + var box = document.getElementById(id); + var boxOptions = box.options; + var boxOptionsLength = boxOptions.length; + for (var i = 0; i < boxOptionsLength; i++) { + boxOptions[i].selected = 'selected'; + } + } + }; + window.SelectBox = SelectBox; +})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/SelectFilter2.js b/venv/Lib/site-packages/simpleui/static/admin/js/SelectFilter2.js new file mode 100644 index 0000000..c6892bb --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/SelectFilter2.js @@ -0,0 +1,255 @@ +/*global SelectBox, gettext, interpolate, quickElement, SelectFilter*/ +/* +SelectFilter2 - Turns a multiple-select box into a filter interface. + +Requires jQuery, core.js, and SelectBox.js. +*/ +(function ($) { + 'use strict'; + + function findForm(node) { + // returns the node of the form containing the given node + if (node.tagName.toLowerCase() !== 'form') { + return findForm(node.parentNode); + } + return node; + } + + window.SelectFilter = { + init: function (field_id, field_name, is_stacked) { + if (field_id.match(/__prefix__/)) { + // Don't initialize on empty forms. + return; + } + var from_box = document.getElementById(field_id); + from_box.id += '_from'; // change its ID + from_box.className = 'filtered'; + + var ps = from_box.parentNode.getElementsByTagName('p'); + for (var i = 0; i < ps.length; i++) { + if (ps[i].className.indexOf("info") !== -1) { + // Remove

, because it just gets in the way. + from_box.parentNode.removeChild(ps[i]); + } else if (ps[i].className.indexOf("help") !== -1) { + // Move help text up to the top so it isn't below the select + // boxes or wrapped off on the side to the right of the add + // button: + from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild); + } + } + + //

or
+ var selector_div = quickElement('div', from_box.parentNode); + selector_div.className = is_stacked ? 'selector stacked' : 'selector'; + + //
+ var selector_available = quickElement('div', selector_div); + selector_available.className = 'selector-available'; + var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); + quickElement( + 'span', title_available, '', + 'class', 'help help-tooltip help-icon', + 'title', interpolate( + gettext( + 'This is the list of available %s. You may choose some by ' + + 'selecting them in the box below and then clicking the ' + + '"Choose" arrow between the two boxes.' + ), + [field_name] + ) + ); + + var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); + filter_p.className = 'selector-filter'; + + var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input'); + + quickElement( + 'span', search_filter_label, '', + 'class', 'help-tooltip search-label-icon', + 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) + ); + + filter_p.appendChild(document.createTextNode(' ')); + + var filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); + filter_input.id = field_id + '_input'; + + selector_available.appendChild(from_box); + var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_add_all_link'); + choose_all.className = 'selector-chooseall'; + + //
    + var selector_chooser = quickElement('ul', selector_div); + selector_chooser.className = 'selector-chooser'; + var add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', '#', 'id', field_id + '_add_link'); + add_link.className = 'selector-add'; + var remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', '#', 'id', field_id + '_remove_link'); + remove_link.className = 'selector-remove'; + + //
    + var selector_chosen = quickElement('div', selector_div); + selector_chosen.className = 'selector-chosen'; + var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); + quickElement( + 'span', title_chosen, '', + 'class', 'help help-tooltip help-icon', + 'title', interpolate( + gettext( + 'This is the list of chosen %s. You may remove some by ' + + 'selecting them in the box below and then clicking the ' + + '"Remove" arrow between the two boxes.' + ), + [field_name] + ) + ); + + var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name')); + to_box.className = 'filtered'; + var clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_remove_all_link'); + clear_all.className = 'selector-clearall'; + + from_box.setAttribute('name', from_box.getAttribute('name') + '_old'); + + // Set up the JavaScript event handlers for the select box filter interface + var move_selection = function (e, elem, move_func, from, to) { + if (elem.className.indexOf('active') !== -1) { + move_func(from, to); + SelectFilter.refresh_icons(field_id); + } + e.preventDefault(); + }; + choose_all.addEventListener('click', function (e) { + move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); + }); + add_link.addEventListener('click', function (e) { + move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); + }); + remove_link.addEventListener('click', function (e) { + move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from'); + }); + clear_all.addEventListener('click', function (e) { + move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from'); + }); + filter_input.addEventListener('keypress', function (e) { + SelectFilter.filter_key_press(e, field_id); + }); + filter_input.addEventListener('keyup', function (e) { + SelectFilter.filter_key_up(e, field_id); + }); + filter_input.addEventListener('keydown', function (e) { + SelectFilter.filter_key_down(e, field_id); + }); + selector_div.addEventListener('change', function (e) { + if (e.target.tagName === 'SELECT') { + SelectFilter.refresh_icons(field_id); + } + }); + selector_div.addEventListener('dblclick', function (e) { + if (e.target.tagName === 'OPTION') { + if (e.target.closest('select').id === field_id + '_to') { + SelectBox.move(field_id + '_to', field_id + '_from'); + } else { + SelectBox.move(field_id + '_from', field_id + '_to'); + } + SelectFilter.refresh_icons(field_id); + } + }); + findForm(from_box).addEventListener('submit', function () { + SelectBox.select_all(field_id + '_to'); + }); + SelectBox.init(field_id + '_from'); + SelectBox.init(field_id + '_to'); + // Move selected from_box options to to_box + SelectBox.move(field_id + '_from', field_id + '_to'); + + if (!is_stacked) { + // In horizontal mode, give the same height to the two boxes. + var j_from_box = $(from_box); + var j_to_box = $(to_box); + var resize_filters = function () { + j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight()); + }; + if (j_from_box.outerHeight() > 0) { + resize_filters(); // This fieldset is already open. Resize now. + } else { + // This fieldset is probably collapsed. Wait for its 'show' event. + j_to_box.closest('fieldset').one('show.fieldset', resize_filters); + } + } + + // Initial icon refresh + SelectFilter.refresh_icons(field_id); + }, + any_selected: function (field) { + var any_selected = false; + try { + // Temporarily add the required attribute and check validity. + // This is much faster in WebKit browsers than the fallback. + field.attr('required', 'required'); + any_selected = field.is(':valid'); + field.removeAttr('required'); + } catch (e) { + // Browsers that don't support :valid (IE < 10) + any_selected = field.find('option:selected').length > 0; + } + return any_selected; + }, + refresh_icons: function (field_id) { + var from = $('#' + field_id + '_from'); + var to = $('#' + field_id + '_to'); + // Active if at least one item is selected + $('#' + field_id + '_add_link').toggleClass('active', SelectFilter.any_selected(from)); + $('#' + field_id + '_remove_link').toggleClass('active', SelectFilter.any_selected(to)); + // Active if the corresponding box isn't empty + $('#' + field_id + '_add_all_link').toggleClass('active', from.find('option').length > 0); + $('#' + field_id + '_remove_all_link').toggleClass('active', to.find('option').length > 0); + }, + filter_key_press: function (event, field_id) { + var from = document.getElementById(field_id + '_from'); + // don't submit form if user pressed Enter + if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { + from.selectedIndex = 0; + SelectBox.move(field_id + '_from', field_id + '_to'); + from.selectedIndex = 0; + event.preventDefault(); + return false; + } + }, + filter_key_up: function (event, field_id) { + var from = document.getElementById(field_id + '_from'); + var temp = from.selectedIndex; + SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value); + from.selectedIndex = temp; + return true; + }, + filter_key_down: function (event, field_id) { + var from = document.getElementById(field_id + '_from'); + // right arrow -- move across + if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) { + var old_index = from.selectedIndex; + SelectBox.move(field_id + '_from', field_id + '_to'); + from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index; + return false; + } + // down arrow -- wrap around + if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { + from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1; + } + // up arrow -- wrap around + if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { + from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1; + } + return true; + } + }; + + window.addEventListener('load', function (e) { + $('select.selectfilter, select.selectfilterstacked').each(function () { + var $el = $(this), + data = $el.data(); + SelectFilter.init($el.attr('id'), data.fieldName, parseInt(data.isStacked, 10)); + }); + }); + +})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/actions.js b/venv/Lib/site-packages/simpleui/static/admin/js/actions.js new file mode 100644 index 0000000..9dbed44 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/actions.js @@ -0,0 +1,155 @@ +/*global gettext, interpolate, ngettext*/ +(function ($) { + 'use strict'; + var lastChecked; + + $.fn.actions = function (opts) { + var options = $.extend({}, $.fn.actions.defaults, opts); + var actionCheckboxes = $(this); + var list_editable_changed = false; + var showQuestion = function () { + $(options.acrossClears).hide(); + $(options.acrossQuestions).show(); + $(options.allContainer).hide(); + }, + showClear = function () { + $(options.acrossClears).show(); + $(options.acrossQuestions).hide(); + $(options.actionContainer).toggleClass(options.selectedClass); + $(options.allContainer).show(); + $(options.counterContainer).hide(); + }, + reset = function () { + $(options.acrossClears).hide(); + $(options.acrossQuestions).hide(); + $(options.allContainer).hide(); + $(options.counterContainer).show(); + }, + clearAcross = function () { + reset(); + $(options.acrossInput).val(0); + $(options.actionContainer).removeClass(options.selectedClass); + }, + checker = function (checked) { + if (checked) { + showQuestion(); + } else { + reset(); + } + $(actionCheckboxes).prop("checked", checked) + .parent().parent().toggleClass(options.selectedClass, checked); + }, + updateCounter = function () { + var sel = $(actionCheckboxes).filter(":checked").length; + // data-actions-icnt is defined in the generated HTML + // and contains the total amount of objects in the queryset + var actions_icnt = $('.action-counter').data('actionsIcnt'); + $(options.counterContainer).html(interpolate( + ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { + sel: sel, + cnt: actions_icnt + }, true)); + $(options.allToggle).prop("checked", function () { + var value; + if (sel === actionCheckboxes.length) { + value = true; + showQuestion(); + } else { + value = false; + clearAcross(); + } + return value; + }); + }; + // Show counter by default + $(options.counterContainer).show(); + // Check state of checkboxes and reinit state if needed + $(this).filter(":checked").each(function (i) { + $(this).parent().parent().toggleClass(options.selectedClass); + updateCounter(); + if ($(options.acrossInput).val() === 1) { + showClear(); + } + }); + $(options.allToggle).show().click(function () { + checker($(this).prop("checked")); + updateCounter(); + }); + $("a", options.acrossQuestions).click(function (event) { + event.preventDefault(); + $(options.acrossInput).val(1); + showClear(); + }); + $("a", options.acrossClears).click(function (event) { + event.preventDefault(); + $(options.allToggle).prop("checked", false); + clearAcross(); + checker(0); + updateCounter(); + }); + lastChecked = null; + $(actionCheckboxes).click(function (event) { + if (!event) { + event = window.event; + } + var target = event.target ? event.target : event.srcElement; + if (lastChecked && $.data(lastChecked) !== $.data(target) && event.shiftKey === true) { + var inrange = false; + $(lastChecked).prop("checked", target.checked) + .parent().parent().toggleClass(options.selectedClass, target.checked); + $(actionCheckboxes).each(function () { + if ($.data(this) === $.data(lastChecked) || $.data(this) === $.data(target)) { + inrange = (inrange) ? false : true; + } + if (inrange) { + $(this).prop("checked", target.checked) + .parent().parent().toggleClass(options.selectedClass, target.checked); + } + }); + } + $(target).parent().parent().toggleClass(options.selectedClass, target.checked); + lastChecked = target; + updateCounter(); + }); + $('form#changelist-form table#result_list tr').on('change', 'td:gt(0) :input', function () { + list_editable_changed = true; + }); + $('form#changelist-form button[name="index"]').click(function (event) { + if (list_editable_changed) { + return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); + } + }); + $('form#changelist-form input[name="_save"]').click(function (event) { + var action_changed = false; + $('select option:selected', options.actionContainer).each(function () { + if ($(this).val()) { + action_changed = true; + } + }); + if (action_changed) { + if (list_editable_changed) { + return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")); + } else { + return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button.")); + } + } + }); + }; + /* Setup plugin defaults */ + $.fn.actions.defaults = { + actionContainer: "div.actions", + counterContainer: "span.action-counter", + allContainer: "div.actions span.all", + acrossInput: "div.actions input.select-across", + acrossQuestions: "div.actions span.question", + acrossClears: "div.actions span.clear", + allToggle: "#action-toggle", + selectedClass: "selected" + }; + $(document).ready(function () { + var $actionsEls = $('tr input.action-select'); + if ($actionsEls.length > 0) { + $actionsEls.actions(); + } + }); +})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/actions.min.js b/venv/Lib/site-packages/simpleui/static/admin/js/actions.min.js new file mode 100644 index 0000000..1b771fb --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/actions.min.js @@ -0,0 +1,6 @@ +(function(a){var f;a.fn.actions=function(e){var b=a.extend({},a.fn.actions.defaults,e),g=a(this),k=!1,l=function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},m=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},n=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},p=function(){n(); +a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)},q=function(c){c?l():n();a(g).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},h=function(){var c=a(g).filter(":checked").length,d=a(".action-counter").data("actionsIcnt");a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:d},!0));a(b.allToggle).prop("checked",function(){var a;c===g.length?(a=!0,l()):(a=!1,p());return a})};a(b.counterContainer).show(); +a(this).filter(":checked").each(function(c){a(this).parent().parent().toggleClass(b.selectedClass);h();1===a(b.acrossInput).val()&&m()});a(b.allToggle).show().click(function(){q(a(this).prop("checked"));h()});a("a",b.acrossQuestions).click(function(c){c.preventDefault();a(b.acrossInput).val(1);m()});a("a",b.acrossClears).click(function(c){c.preventDefault();a(b.allToggle).prop("checked",!1);p();q(0);h()});f=null;a(g).click(function(c){c||(c=window.event);var d=c.target?c.target:c.srcElement;if(f&& +a.data(f)!==a.data(d)&&!0===c.shiftKey){var e=!1;a(f).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked);a(g).each(function(){if(a.data(this)===a.data(f)||a.data(this)===a.data(d))e=e?!1:!0;e&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);f=d;h()});a("form#changelist-form table#result_list tr").on("change","td:gt(0) :input",function(){k=!0});a('form#changelist-form button[name="index"]').click(function(a){if(k)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))}); +a('form#changelist-form input[name="_save"]').click(function(c){var d=!1;a("select option:selected",b.actionContainer).each(function(){a(this).val()&&(d=!0)});if(d)return k?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")):confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})}; +a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"};a(document).ready(function(){var e=a("tr input.action-select");0 +// +(function () { + 'use strict'; + var DateTimeShortcuts = { + calendars: [], + calendarInputs: [], + clockInputs: [], + clockHours: { + default_: [ + [gettext_noop('Now'), -1], + [gettext_noop('Midnight'), 0], + [gettext_noop('6 a.m.'), 6], + [gettext_noop('Noon'), 12], + [gettext_noop('6 p.m.'), 18] + ] + }, + dismissClockFunc: [], + dismissCalendarFunc: [], + calendarDivName1: 'calendarbox', // name of calendar
    that gets toggled + calendarDivName2: 'calendarin', // name of
    that contains calendar + calendarLinkName: 'calendarlink',// name of the link that is used to toggle + clockDivName: 'clockbox', // name of clock
    that gets toggled + clockLinkName: 'clocklink', // name of the link that is used to toggle + shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts + timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch + timezoneOffset: 0, + init: function () { + var body = document.getElementsByTagName('body')[0]; + var serverOffset = body.getAttribute('data-admin-utc-offset'); + if (serverOffset) { + var localOffset = new Date().getTimezoneOffset() * -60; + DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; + } + + var inputs = document.getElementsByTagName('input'); + for (var i = 0; i < inputs.length; i++) { + var inp = inputs[i]; + if (inp.getAttribute('type') === 'text' && inp.className.match(/vTimeField/)) { + DateTimeShortcuts.addClock(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } else if (inp.getAttribute('type') === 'text' && inp.className.match(/vDateField/)) { + DateTimeShortcuts.addCalendar(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } + } + }, + // Return the current time while accounting for the server timezone. + now: function () { + var body = document.getElementsByTagName('body')[0]; + var serverOffset = body.getAttribute('data-admin-utc-offset'); + if (serverOffset) { + var localNow = new Date(); + var localOffset = localNow.getTimezoneOffset() * -60; + localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset)); + return localNow; + } else { + return new Date(); + } + }, + // Add a warning when the time zone in the browser and backend do not match. + addTimezoneWarning: function (inp) { + var $ = django.jQuery; + var warningClass = DateTimeShortcuts.timezoneWarningClass; + var timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600; + + // Only warn if there is a time zone mismatch. + if (!timezoneOffset) { + return; + } + + // Check if warning is already there. + if ($(inp).siblings('.' + warningClass).length) { + return; + } + + var message; + if (timezoneOffset > 0) { + message = ngettext( + 'Note: You are %s hour ahead of server time.', + 'Note: You are %s hours ahead of server time.', + timezoneOffset + ); + } else { + timezoneOffset *= -1; + message = ngettext( + 'Note: You are %s hour behind server time.', + 'Note: You are %s hours behind server time.', + timezoneOffset + ); + } + message = interpolate(message, [timezoneOffset]); + + var $warning = $(''); + $warning.attr('class', warningClass); + $warning.text(message); + + $(inp).parent() + .append($('
    ')) + .append($warning); + }, + // Add clock widget to a given field + addClock: function (inp) { + var num = DateTimeShortcuts.clockInputs.length; + DateTimeShortcuts.clockInputs[num] = inp; + DateTimeShortcuts.dismissClockFunc[num] = function () { + DateTimeShortcuts.dismissClock(num); + return true; + }; + + // Shortcut links (clock icon and "Now" link) + var shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + var now_link = document.createElement('a'); + now_link.setAttribute('href', "#"); + now_link.appendChild(document.createTextNode(gettext('Now'))); + now_link.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.handleClockQuicklink(num, -1); + }); + var clock_link = document.createElement('a'); + clock_link.setAttribute('href', '#'); + clock_link.id = DateTimeShortcuts.clockLinkName + num; + clock_link.addEventListener('click', function (e) { + e.preventDefault(); + // avoid triggering the document click handler to dismiss the clock + e.stopPropagation(); + DateTimeShortcuts.openClock(num); + }); + + quickElement( + 'span', clock_link, '', + 'class', 'clock-icon', + 'title', gettext('Choose a Time') + ); + shortcuts_span.appendChild(document.createTextNode('\u00A0')); + shortcuts_span.appendChild(now_link); + shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); + shortcuts_span.appendChild(clock_link); + + // Create clock link div + // + // Markup looks like: + //
    + //

    Choose a time

    + // + //

    Cancel

    + //
    + + var clock_box = document.createElement('div'); + clock_box.style.display = 'none'; + clock_box.style.position = 'absolute'; + clock_box.className = 'clockbox module'; + clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num); + document.body.appendChild(clock_box); + clock_box.addEventListener('click', function (e) { + e.stopPropagation(); + }); + + quickElement('h2', clock_box, gettext('Choose a time')); + var time_list = quickElement('ul', clock_box); + time_list.className = 'timelist'; + // The list of choices can be overridden in JavaScript like this: + // DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]]; + // where name is the name attribute of the . + var name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name; + DateTimeShortcuts.clockHours[name].forEach(function (element) { + var time_link = quickElement('a', quickElement('li', time_list), gettext(element[0]), 'href', '#'); + time_link.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.handleClockQuicklink(num, element[1]); + }); + }); + + var cancel_p = quickElement('p', clock_box); + cancel_p.className = 'calendar-cancel'; + var cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); + cancel_link.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.dismissClock(num); + }); + + document.addEventListener('keyup', function (event) { + if (event.which === 27) { + // ESC key closes popup + DateTimeShortcuts.dismissClock(num); + event.preventDefault(); + } + }); + }, + openClock: function (num) { + var clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num); + var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num); + + // Recalculate the clockbox position + // is it left-to-right or right-to-left layout ? + if (getStyle(document.body, 'direction') !== 'rtl') { + clock_box.style.left = findPosX(clock_link) + 17 + 'px'; + } else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + // TODO: IE returns wrong value for findPosX when in rtl mode + // (it returns as it was left aligned), needs to be fixed. + clock_box.style.left = findPosX(clock_link) - 110 + 'px'; + } + clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; + + // Show the clock box + clock_box.style.display = 'block'; + document.addEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); + }, + dismissClock: function (num) { + document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; + document.removeEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); + }, + handleClockQuicklink: function (num, val) { + var d; + if (val === -1) { + d = DateTimeShortcuts.now(); + } else { + d = new Date(1970, 1, 1, val, 0, 0, 0); + } + DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]); + DateTimeShortcuts.clockInputs[num].focus(); + DateTimeShortcuts.dismissClock(num); + }, + // Add calendar widget to a given field. + addCalendar: function (inp) { + var num = DateTimeShortcuts.calendars.length; + + DateTimeShortcuts.calendarInputs[num] = inp; + DateTimeShortcuts.dismissCalendarFunc[num] = function () { + DateTimeShortcuts.dismissCalendar(num); + return true; + }; + + // Shortcut links (calendar icon and "Today" link) + var shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + var today_link = document.createElement('a'); + today_link.setAttribute('href', '#'); + today_link.appendChild(document.createTextNode(gettext('Today'))); + today_link.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, 0); + }); + var cal_link = document.createElement('a'); + cal_link.setAttribute('href', '#'); + cal_link.id = DateTimeShortcuts.calendarLinkName + num; + cal_link.addEventListener('click', function (e) { + e.preventDefault(); + // avoid triggering the document click handler to dismiss the calendar + e.stopPropagation(); + DateTimeShortcuts.openCalendar(num); + }); + quickElement( + 'span', cal_link, '', + 'class', 'date-icon', + 'title', gettext('Choose a Date') + ); + shortcuts_span.appendChild(document.createTextNode('\u00A0')); + shortcuts_span.appendChild(today_link); + shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); + shortcuts_span.appendChild(cal_link); + + // Create calendarbox div. + // + // Markup looks like: + // + //
    + //

    + // + // February 2003 + //

    + //
    + // + //
    + //
    + // Yesterday | Today | Tomorrow + //
    + //

    Cancel

    + //
    + var cal_box = document.createElement('div'); + cal_box.style.display = 'none'; + cal_box.style.position = 'absolute'; + cal_box.className = 'calendarbox module'; + cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num); + document.body.appendChild(cal_box); + cal_box.addEventListener('click', function (e) { + e.stopPropagation(); + }); + + // next-prev links + var cal_nav = quickElement('div', cal_box); + var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#'); + cal_nav_prev.className = 'calendarnav-previous'; + cal_nav_prev.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.drawPrev(num); + }); + + var cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#'); + cal_nav_next.className = 'calendarnav-next'; + cal_nav_next.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.drawNext(num); + }); + + // main box + var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); + cal_main.className = 'calendar'; + DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); + DateTimeShortcuts.calendars[num].drawCurrent(); + + // calendar shortcuts + var shortcuts = quickElement('div', cal_box); + shortcuts.className = 'calendar-shortcuts'; + var day_link = quickElement('a', shortcuts, gettext('Yesterday'), 'href', '#'); + day_link.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, -1); + }); + shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); + day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#'); + day_link.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, 0); + }); + shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); + day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#'); + day_link.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, +1); + }); + + // cancel bar + var cancel_p = quickElement('p', cal_box); + cancel_p.className = 'calendar-cancel'; + var cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); + cancel_link.addEventListener('click', function (e) { + e.preventDefault(); + DateTimeShortcuts.dismissCalendar(num); + }); + django.jQuery(document).bind('keyup', function (event) { + if (event.which === 27) { + // ESC key closes popup + DateTimeShortcuts.dismissCalendar(num); + event.preventDefault(); + } + }); + }, + openCalendar: function (num) { + var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num); + var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num); + var inp = DateTimeShortcuts.calendarInputs[num]; + + // Determine if the current value in the input has a valid date. + // If so, draw the calendar with that date's year and month. + if (inp.value) { + var format = get_format('DATE_INPUT_FORMATS')[0]; + var selected = inp.value.strptime(format); + var year = selected.getUTCFullYear(); + var month = selected.getUTCMonth() + 1; + var re = /\d{4}/; + if (re.test(year.toString()) && month >= 1 && month <= 12) { + DateTimeShortcuts.calendars[num].drawDate(month, year, selected); + } + } + + // Recalculate the clockbox position + // is it left-to-right or right-to-left layout ? + if (getStyle(document.body, 'direction') !== 'rtl') { + cal_box.style.left = findPosX(cal_link) + 17 + 'px'; + } else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + // TODO: IE returns wrong value for findPosX when in rtl mode + // (it returns as it was left aligned), needs to be fixed. + cal_box.style.left = findPosX(cal_link) - 180 + 'px'; + } + cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'; + + cal_box.style.display = 'block'; + document.addEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); + }, + dismissCalendar: function (num) { + document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; + document.removeEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); + }, + drawPrev: function (num) { + DateTimeShortcuts.calendars[num].drawPreviousMonth(); + }, + drawNext: function (num) { + DateTimeShortcuts.calendars[num].drawNextMonth(); + }, + handleCalendarCallback: function (num) { + var format = get_format('DATE_INPUT_FORMATS')[0]; + // the format needs to be escaped a little + format = format.replace('\\', '\\\\'); + format = format.replace('\r', '\\r'); + format = format.replace('\n', '\\n'); + format = format.replace('\t', '\\t'); + format = format.replace("'", "\\'"); + return function (y, m, d) { + DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); + DateTimeShortcuts.calendarInputs[num].focus(); + document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; + }; + }, + handleCalendarQuickLink: function (num, offset) { + var d = DateTimeShortcuts.now(); + d.setDate(d.getDate() + offset); + DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); + DateTimeShortcuts.calendarInputs[num].focus(); + DateTimeShortcuts.dismissCalendar(num); + } + }; + + window.addEventListener('load', DateTimeShortcuts.init); + window.DateTimeShortcuts = DateTimeShortcuts; +})(); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/admin/RelatedObjectLookups.js b/venv/Lib/site-packages/simpleui/static/admin/js/admin/RelatedObjectLookups.js new file mode 100644 index 0000000..dd9bef1 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/admin/RelatedObjectLookups.js @@ -0,0 +1,181 @@ +/*global SelectBox, interpolate*/ +// Handles related-objects functionality: lookup link for raw_id_fields +// and Add Another links. + +(function ($) { + 'use strict'; + + // IE doesn't accept periods or dashes in the window name, but the element IDs + // we use to generate popup window names may contain them, therefore we map them + // to allowed characters in a reversible way so that we can locate the correct + // element when the popup window is dismissed. + function id_to_windowname(text) { + text = text.replace(/\./g, '__dot__'); + text = text.replace(/\-/g, '__dash__'); + return text; + } + + function windowname_to_id(text) { + text = text.replace(/__dot__/g, '.'); + text = text.replace(/__dash__/g, '-'); + return text; + } + + function showAdminPopup(triggeringLink, name_regexp, add_popup) { + var name = triggeringLink.id.replace(name_regexp, ''); + name = id_to_windowname(name); + var href = triggeringLink.href; + if (add_popup) { + if (href.indexOf('?') === -1) { + href += '?_popup=1'; + } else { + href += '&_popup=1'; + } + } + var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); + win.focus(); + return false; + } + + function showRelatedObjectLookupPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^lookup_/, true); + } + + function dismissRelatedLookupPopup(win, chosenId) { + var name = windowname_to_id(win.name); + var elem = document.getElementById(name); + if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) { + elem.value += ',' + chosenId; + } else { + document.getElementById(name).value = chosenId; + } + win.close(); + } + + function showRelatedObjectPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); + } + + function updateRelatedObjectLinks(triggeringLink) { + var $this = $(triggeringLink); + var siblings = $this.nextAll('.change-related, .delete-related'); + if (!siblings.length) { + return; + } + var value = $this.val(); + if (value) { + siblings.each(function () { + var elm = $(this); + elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); + }); + } else { + siblings.removeAttr('href'); + } + } + + function dismissAddRelatedObjectPopup(win, newId, newRepr) { + var name = windowname_to_id(win.name); + var elem = document.getElementById(name); + if (elem) { + var elemName = elem.nodeName.toUpperCase(); + if (elemName === 'SELECT') { + elem.options[elem.options.length] = new Option(newRepr, newId, true, true); + } else if (elemName === 'INPUT') { + if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) { + elem.value += ',' + newId; + } else { + elem.value = newId; + } + } + // Trigger a change event to update related links if required. + $(elem).trigger('change'); + } else { + var toId = name + "_to"; + var o = new Option(newRepr, newId); + SelectBox.add_to_cache(toId, o); + SelectBox.redisplay(toId); + } + win.close(); + } + + function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { + var id = windowname_to_id(win.name).replace(/^edit_/, ''); + var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); + var selects = $(selectsSelector); + selects.find('option').each(function () { + if (this.value === objId) { + this.textContent = newRepr; + this.value = newId; + } + }); + selects.next().find('.select2-selection__rendered').each(function () { + // The element can have a clear button as a child. + // Use the lastChild to modify only the displayed value. + this.lastChild.textContent = newRepr; + this.title = newRepr; + }); + win.close(); + } + + function dismissDeleteRelatedObjectPopup(win, objId) { + var id = windowname_to_id(win.name).replace(/^delete_/, ''); + var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); + var selects = $(selectsSelector); + selects.find('option').each(function () { + if (this.value === objId) { + $(this).remove(); + } + }).trigger('change'); + win.close(); + } + + // Global for testing purposes + window.id_to_windowname = id_to_windowname; + window.windowname_to_id = windowname_to_id; + + window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; + window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; + window.showRelatedObjectPopup = showRelatedObjectPopup; + window.updateRelatedObjectLinks = updateRelatedObjectLinks; + window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; + window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; + window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; + + // Kept for backward compatibility + window.showAddAnotherPopup = showRelatedObjectPopup; + window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; + + $(document).ready(function () { + $("a[data-popup-opener]").click(function (event) { + event.preventDefault(); + opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); + }); + $('body').on('click', '.related-widget-wrapper-link', function (e) { + e.preventDefault(); + if (this.href) { + var event = $.Event('django:show-related', {href: this.href}); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showRelatedObjectPopup(this); + } + } + }); + $('body').on('change', '.related-widget-wrapper select', function (e) { + var event = $.Event('django:update-related'); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + updateRelatedObjectLinks(this); + } + }); + $('.related-widget-wrapper select').trigger('change'); + $('body').on('click', '.related-lookup', function (e) { + e.preventDefault(); + var event = $.Event('django:lookup-related'); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showRelatedObjectLookupPopup(this); + } + }); + }); + +})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/autocomplete.js b/venv/Lib/site-packages/simpleui/static/admin/js/autocomplete.js new file mode 100644 index 0000000..89b46bf --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/autocomplete.js @@ -0,0 +1,37 @@ +(function ($) { + 'use strict'; + var init = function ($element, options) { + var settings = $.extend({ + ajax: { + data: function (params) { + return { + term: params.term, + page: params.page + }; + } + } + }, options); + $element.select2(settings); + }; + + $.fn.djangoAdminSelect2 = function (options) { + var settings = $.extend({}, options); + $.each(this, function (i, element) { + var $element = $(element); + init($element, settings); + }); + return this; + }; + + $(function () { + // Initialize all autocomplete widgets except the one in the template + // form used when a new formset is added. + $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); + }); + + $(document).on('formset:added', (function () { + return function (event, $newFormset) { + return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); + }; + })(this)); +}(django.jQuery)); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/calendar.js b/venv/Lib/site-packages/simpleui/static/admin/js/calendar.js new file mode 100644 index 0000000..97ab322 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/calendar.js @@ -0,0 +1,205 @@ +/*global gettext, pgettext, get_format, quickElement, removeChildren*/ +/* +calendar.js - Calendar functions by Adrian Holovaty +depends on core.js for utility functions like removeChildren or quickElement +*/ + +(function () { + 'use strict'; + // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions + var CalendarNamespace = { + monthsOfYear: [ + gettext('January'), + gettext('February'), + gettext('March'), + gettext('April'), + gettext('May'), + gettext('June'), + gettext('July'), + gettext('August'), + gettext('September'), + gettext('October'), + gettext('November'), + gettext('December') + ], + daysOfWeek: [ + pgettext('one letter Sunday', 'S'), + pgettext('one letter Monday', 'M'), + pgettext('one letter Tuesday', 'T'), + pgettext('one letter Wednesday', 'W'), + pgettext('one letter Thursday', 'T'), + pgettext('one letter Friday', 'F'), + pgettext('one letter Saturday', 'S') + ], + firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), + isLeapYear: function (year) { + return (((year % 4) === 0) && ((year % 100) !== 0) || ((year % 400) === 0)); + }, + getDaysInMonth: function (month, year) { + var days; + if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { + days = 31; + } else if (month === 4 || month === 6 || month === 9 || month === 11) { + days = 30; + } else if (month === 2 && CalendarNamespace.isLeapYear(year)) { + days = 29; + } else { + days = 28; + } + return days; + }, + draw: function (month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999 + var today = new Date(); + var todayDay = today.getDate(); + var todayMonth = today.getMonth() + 1; + var todayYear = today.getFullYear(); + var todayClass = ''; + + // Use UTC functions here because the date field does not contain time + // and using the UTC function variants prevent the local time offset + // from altering the date, specifically the day field. For example: + // + // ``` + // var x = new Date('2013-10-02'); + // var day = x.getDate(); + // ``` + // + // The day variable above will be 1 instead of 2 in, say, US Pacific time + // zone. + var isSelectedMonth = false; + if (typeof selected !== 'undefined') { + isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); + } + + month = parseInt(month); + year = parseInt(year); + var calDiv = document.getElementById(div_id); + removeChildren(calDiv); + var calTable = document.createElement('table'); + quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); + var tableBody = quickElement('tbody', calTable); + + // Draw days-of-week header + var tableRow = quickElement('tr', tableBody); + for (var i = 0; i < 7; i++) { + quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]); + } + + var startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); + var days = CalendarNamespace.getDaysInMonth(month, year); + + var nonDayCell; + + // Draw blanks before first of month + tableRow = quickElement('tr', tableBody); + for (i = 0; i < startingPos; i++) { + nonDayCell = quickElement('td', tableRow, ' '); + nonDayCell.className = "nonday"; + } + + function calendarMonth(y, m) { + function onClick(e) { + e.preventDefault(); + callback(y, m, this.textContent); + } + + return onClick; + } + + // Draw days of month + var currentDay = 1; + for (i = startingPos; currentDay <= days; i++) { + if (i % 7 === 0 && currentDay !== 1) { + tableRow = quickElement('tr', tableBody); + } + if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { + todayClass = 'today'; + } else { + todayClass = ''; + } + + // use UTC function; see above for explanation. + if (isSelectedMonth && currentDay === selected.getUTCDate()) { + if (todayClass !== '') { + todayClass += " "; + } + todayClass += "selected"; + } + + var cell = quickElement('td', tableRow, '', 'class', todayClass); + var link = quickElement('a', cell, currentDay, 'href', '#'); + link.addEventListener('click', calendarMonth(year, month)); + currentDay++; + } + + // Draw blanks after end of month (optional, but makes for valid code) + while (tableRow.childNodes.length < 7) { + nonDayCell = quickElement('td', tableRow, ' '); + nonDayCell.className = "nonday"; + } + + calDiv.appendChild(calTable); + } + }; + + // Calendar -- A calendar instance + function Calendar(div_id, callback, selected) { + // div_id (string) is the ID of the element in which the calendar will + // be displayed + // callback (string) is the name of a JavaScript function that will be + // called with the parameters (year, month, day) when a day in the + // calendar is clicked + this.div_id = div_id; + this.callback = callback; + this.today = new Date(); + this.currentMonth = this.today.getMonth() + 1; + this.currentYear = this.today.getFullYear(); + if (typeof selected !== 'undefined') { + this.selected = selected; + } + } + + Calendar.prototype = { + drawCurrent: function () { + CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); + }, + drawDate: function (month, year, selected) { + this.currentMonth = month; + this.currentYear = year; + + if (selected) { + this.selected = selected; + } + + this.drawCurrent(); + }, + drawPreviousMonth: function () { + if (this.currentMonth === 1) { + this.currentMonth = 12; + this.currentYear--; + } else { + this.currentMonth--; + } + this.drawCurrent(); + }, + drawNextMonth: function () { + if (this.currentMonth === 12) { + this.currentMonth = 1; + this.currentYear++; + } else { + this.currentMonth++; + } + this.drawCurrent(); + }, + drawPreviousYear: function () { + this.currentYear--; + this.drawCurrent(); + }, + drawNextYear: function () { + this.currentYear++; + this.drawCurrent(); + } + }; + window.Calendar = Calendar; + window.CalendarNamespace = CalendarNamespace; +})(); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/cancel.js b/venv/Lib/site-packages/simpleui/static/admin/js/cancel.js new file mode 100644 index 0000000..f21b718 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/cancel.js @@ -0,0 +1,9 @@ +(function ($) { + 'use strict'; + $(function () { + $('.cancel-link').click(function (e) { + e.preventDefault(); + window.history.back(); + }); + }); +})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/change_form.js b/venv/Lib/site-packages/simpleui/static/admin/js/change_form.js new file mode 100644 index 0000000..89b9a0f --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/change_form.js @@ -0,0 +1,20 @@ +/*global showAddAnotherPopup, showRelatedObjectLookupPopup showRelatedObjectPopup updateRelatedObjectLinks*/ + +(function ($) { + 'use strict'; + $(document).ready(function () { + var modelName = $('#django-admin-form-add-constants').data('modelName'); + $('body').on('click', '.add-another', function (e) { + e.preventDefault(); + var event = $.Event('django:add-another-related'); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showAddAnotherPopup(this); + } + }); + + if (modelName) { + $('form#' + modelName + '_form :input:visible:enabled:first').focus(); + } + }); +})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/collapse.js b/venv/Lib/site-packages/simpleui/static/admin/js/collapse.js new file mode 100644 index 0000000..de5a353 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/collapse.js @@ -0,0 +1,26 @@ +/*global gettext*/ +(function ($) { + 'use strict'; + $(document).ready(function () { + // Add anchor tag for Show/Hide link + $("fieldset.collapse").each(function (i, elem) { + // Don't hide if fields in this fieldset have errors + if ($(elem).find("div.errors").length === 0) { + $(elem).addClass("collapsed").find("h2").first().append(' (' + gettext("Show") + + ')'); + } + }); + // Add toggle to anchor tag + $("fieldset.collapse a.collapse-toggle").click(function (ev) { + if ($(this).closest("fieldset").hasClass("collapsed")) { + // Show + $(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]); + } else { + // Hide + $(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]); + } + return false; + }); + }); +})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/collapse.min.js b/venv/Lib/site-packages/simpleui/static/admin/js/collapse.min.js new file mode 100644 index 0000000..669282f --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/collapse.min.js @@ -0,0 +1,5 @@ +var $jscomp={scope:{},findInternal:function(a,c,b){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e'+gettext("Show")+")")});a("fieldset.collapse a.collapse-toggle").click(function(c){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", +[a(this).attr("id")]);return!1})})})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/core.js b/venv/Lib/site-packages/simpleui/static/admin/js/core.js new file mode 100644 index 0000000..1f41748 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/core.js @@ -0,0 +1,209 @@ +// Core javascript helper functions + +// basic browser identification & version +var isOpera = (navigator.userAgent.indexOf("Opera") >= 0) && parseFloat(navigator.appVersion); +var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]); + +// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); +function quickElement() { + 'use strict'; + var obj = document.createElement(arguments[0]); + if (arguments[2]) { + var textNode = document.createTextNode(arguments[2]); + obj.appendChild(textNode); + } + var len = arguments.length; + for (var i = 3; i < len; i += 2) { + obj.setAttribute(arguments[i], arguments[i + 1]); + } + arguments[1].appendChild(obj); + return obj; +} + +// "a" is reference to an object +function removeChildren(a) { + 'use strict'; + while (a.hasChildNodes()) { + a.removeChild(a.lastChild); + } +} + +// ---------------------------------------------------------------------------- +// Find-position functions by PPK +// See http://www.quirksmode.org/js/findpos.html +// ---------------------------------------------------------------------------- +function findPosX(obj) { + 'use strict'; + var curleft = 0; + if (obj.offsetParent) { + while (obj.offsetParent) { + curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft); + obj = obj.offsetParent; + } + // IE offsetParent does not include the top-level + if (isIE && obj.parentElement) { + curleft += obj.offsetLeft - obj.scrollLeft; + } + } else if (obj.x) { + curleft += obj.x; + } + return curleft; +} + +function findPosY(obj) { + 'use strict'; + var curtop = 0; + if (obj.offsetParent) { + while (obj.offsetParent) { + curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop); + obj = obj.offsetParent; + } + // IE offsetParent does not include the top-level + if (isIE && obj.parentElement) { + curtop += obj.offsetTop - obj.scrollTop; + } + } else if (obj.y) { + curtop += obj.y; + } + return curtop; +} + +//----------------------------------------------------------------------------- +// Date object extensions +// ---------------------------------------------------------------------------- +(function () { + 'use strict'; + Date.prototype.getTwelveHours = function () { + var hours = this.getHours(); + if (hours === 0) { + return 12; + } else { + return hours <= 12 ? hours : hours - 12; + } + }; + + Date.prototype.getTwoDigitMonth = function () { + return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); + }; + + Date.prototype.getTwoDigitDate = function () { + return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); + }; + + Date.prototype.getTwoDigitTwelveHour = function () { + return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); + }; + + Date.prototype.getTwoDigitHour = function () { + return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); + }; + + Date.prototype.getTwoDigitMinute = function () { + return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); + }; + + Date.prototype.getTwoDigitSecond = function () { + return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); + }; + + Date.prototype.getHourMinute = function () { + return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute(); + }; + + Date.prototype.getHourMinuteSecond = function () { + return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond(); + }; + + Date.prototype.getFullMonthName = function () { + return typeof window.CalendarNamespace === "undefined" + ? this.getTwoDigitMonth() + : window.CalendarNamespace.monthsOfYear[this.getMonth()]; + }; + + Date.prototype.strftime = function (format) { + var fields = { + B: this.getFullMonthName(), + c: this.toString(), + d: this.getTwoDigitDate(), + H: this.getTwoDigitHour(), + I: this.getTwoDigitTwelveHour(), + m: this.getTwoDigitMonth(), + M: this.getTwoDigitMinute(), + p: (this.getHours() >= 12) ? 'PM' : 'AM', + S: this.getTwoDigitSecond(), + w: '0' + this.getDay(), + x: this.toLocaleDateString(), + X: this.toLocaleTimeString(), + y: ('' + this.getFullYear()).substr(2, 4), + Y: '' + this.getFullYear(), + '%': '%' + }; + var result = '', i = 0; + while (i < format.length) { + if (format.charAt(i) === '%') { + result = result + fields[format.charAt(i + 1)]; + ++i; + } else { + result = result + format.charAt(i); + } + ++i; + } + return result; + }; + +// ---------------------------------------------------------------------------- +// String object extensions +// ---------------------------------------------------------------------------- + String.prototype.pad_left = function (pad_length, pad_string) { + var new_string = this; + for (var i = 0; new_string.length < pad_length; i++) { + new_string = pad_string + new_string; + } + return new_string; + }; + + String.prototype.strptime = function (format) { + var split_format = format.split(/[.\-/]/); + var date = this.split(/[.\-/]/); + var i = 0; + var day, month, year; + while (i < split_format.length) { + switch (split_format[i]) { + case "%d": + day = date[i]; + break; + case "%m": + month = date[i] - 1; + break; + case "%Y": + year = date[i]; + break; + case "%y": + year = date[i]; + break; + } + ++i; + } + // Create Date object from UTC since the parsed value is supposed to be + // in UTC, not local time. Also, the calendar uses UTC functions for + // date extraction. + return new Date(Date.UTC(year, month, day)); + }; + +})(); +// ---------------------------------------------------------------------------- +// Get the computed style for and element +// ---------------------------------------------------------------------------- +function getStyle(oElm, strCssRule) { + 'use strict'; + var strValue = ""; + if (document.defaultView && document.defaultView.getComputedStyle) { + strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); + } else if (oElm.currentStyle) { + strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1) { + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; +} diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/inlines.js b/venv/Lib/site-packages/simpleui/static/admin/js/inlines.js new file mode 100644 index 0000000..063e7ae --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/inlines.js @@ -0,0 +1,295 @@ +/*global DateTimeShortcuts, SelectFilter*/ +/** + * Django admin inlines + * + * Based on jQuery Formset 1.1 + * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) + * @requires jQuery 1.2.6 or later + * + * Copyright (c) 2009, Stanislaus Madueke + * All rights reserved. + * + * Spiced up with Code from Zain Memon's GSoC project 2009 + * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip. + * + * Licensed under the New BSD License + * See: http://www.opensource.org/licenses/bsd-license.php + */ +(function ($) { + 'use strict'; + $.fn.formset = function (opts) { + var options = $.extend({}, $.fn.formset.defaults, opts); + var $this = $(this); + var $parent = $this.parent(); + var updateElementIndex = function (el, prefix, ndx) { + var id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); + var replacement = prefix + "-" + ndx; + if ($(el).prop("for")) { + $(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); + } + if (el.id) { + el.id = el.id.replace(id_regex, replacement); + } + if (el.name) { + el.name = el.name.replace(id_regex, replacement); + } + }; + var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); + var nextIndex = parseInt(totalForms.val(), 10); + var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); + // only show the add button if we are allowed to add more items, + // note that max_num = None translates to a blank string. + var showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; + $this.each(function (i) { + $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); + }); + if ($this.length && showAddButton) { + var addButton = options.addButton; + if (addButton === null) { + if ($this.prop("tagName") === "TR") { + // If forms are laid out as table rows, insert the + // "add" button in a new table row: + var numCols = this.eq(-1).children().length; + $parent.append('' + options.addText + ""); + addButton = $parent.find("tr:last a"); + } else { + // Otherwise, insert it immediately after the last form: + $this.filter(":last").after('"); + addButton = $this.filter(":last").next().find("a"); + } + } + addButton.click(function (e) { + e.preventDefault(); + var template = $("#" + options.prefix + "-empty"); + var row = template.clone(true); + row.removeClass(options.emptyCssClass) + .addClass(options.formCssClass) + .attr("id", options.prefix + "-" + nextIndex); + if (row.is("tr")) { + // If the forms are laid out in table rows, insert + // the remove button into the last table cell: + row.children(":last").append('"); + } else if (row.is("ul") || row.is("ol")) { + // If they're laid out as an ordered/unordered list, + // insert an
  • after the last list item: + row.append('
  • ' + options.deleteText + "
  • "); + } else { + // Otherwise, just insert the remove button as the + // last child element of the form's container: + row.children(":first").append('' + options.deleteText + ""); + } + row.find("*").each(function () { + updateElementIndex(this, options.prefix, totalForms.val()); + }); + // Insert the new form when it has been fully edited + row.insertBefore($(template)); + // Update number of total forms + $(totalForms).val(parseInt(totalForms.val(), 10) + 1); + nextIndex += 1; + // Hide add button in case we've hit the max, except we want to add infinitely + if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { + addButton.parent().hide(); + } + // The delete button of each row triggers a bunch of other things + row.find("a." + options.deleteCssClass).click(function (e1) { + e1.preventDefault(); + // Remove the parent form containing this button: + row.remove(); + nextIndex -= 1; + // If a post-delete callback was provided, call it with the deleted form: + if (options.removed) { + options.removed(row); + } + $(document).trigger('formset:removed', [row, options.prefix]); + // Update the TOTAL_FORMS form count. + var forms = $("." + options.formCssClass); + $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); + // Show add button again once we drop below max + if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { + addButton.parent().show(); + } + // Also, update names and ids for all remaining form controls + // so they remain in sequence: + var i, formCount; + var updateElementCallback = function () { + updateElementIndex(this, options.prefix, i); + }; + for (i = 0, formCount = forms.length; i < formCount; i++) { + updateElementIndex($(forms).get(i), options.prefix, i); + $(forms.get(i)).find("*").each(updateElementCallback); + } + }); + // If a post-add callback was supplied, call it with the added form: + if (options.added) { + options.added(row); + } + $(document).trigger('formset:added', [row, options.prefix]); + }); + } + return this; + }; + + /* Setup plugin defaults */ + $.fn.formset.defaults = { + prefix: "form", // The form prefix for your django formset + addText: "add another", // Text for the add link + deleteText: "remove", // Text for the delete link + addCssClass: "add-row", // CSS class applied to the add link + deleteCssClass: "delete-row", // CSS class applied to the delete link + emptyCssClass: "empty-row", // CSS class applied to the empty row + formCssClass: "dynamic-form", // CSS class applied to each form in a formset + added: null, // Function called each time a new form is added + removed: null, // Function called each time a form is deleted + addButton: null // Existing add button to use + }; + + + // Tabular inlines --------------------------------------------------------- + $.fn.tabularFormset = function (options) { + var $rows = $(this); + var alternatingRows = function (row) { + $($rows.selector).not(".add-row").removeClass("row1 row2") + .filter(":even").addClass("row1").end() + .filter(":odd").addClass("row2"); + }; + + var reinitDateTimeShortCuts = function () { + // Reinitialize the calendar and clock widgets by force + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + + var updateSelectFilter = function () { + // If any SelectFilter widgets are a part of the new form, + // instantiate a new SelectFilter instance for it. + if (typeof SelectFilter !== 'undefined') { + $('.selectfilter').each(function (index, value) { + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], false); + }); + $('.selectfilterstacked').each(function (index, value) { + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], true); + }); + } + }; + + var initPrepopulatedFields = function (row) { + row.find('.prepopulated_field').each(function () { + var field = $(this), + input = field.find('input, select, textarea'), + dependency_list = input.data('dependency_list') || [], + dependencies = []; + $.each(dependency_list, function (i, field_name) { + dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); + }); + if (dependencies.length) { + input.prepopulate(dependencies, input.attr('maxlength')); + } + }); + }; + + $rows.formset({ + prefix: options.prefix, + addText: options.addText, + formCssClass: "dynamic-" + options.prefix, + deleteCssClass: "inline-deletelink", + deleteText: options.deleteText, + emptyCssClass: "empty-form", + removed: alternatingRows, + added: function (row) { + initPrepopulatedFields(row); + reinitDateTimeShortCuts(); + updateSelectFilter(); + alternatingRows(row); + }, + addButton: options.addButton + }); + + return $rows; + }; + + // Stacked inlines --------------------------------------------------------- + $.fn.stackedFormset = function (options) { + var $rows = $(this); + var updateInlineLabel = function (row) { + $($rows.selector).find(".inline_label").each(function (i) { + var count = i + 1; + $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); + }); + }; + + var reinitDateTimeShortCuts = function () { + // Reinitialize the calendar and clock widgets by force, yuck. + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + + var updateSelectFilter = function () { + // If any SelectFilter widgets were added, instantiate a new instance. + if (typeof SelectFilter !== "undefined") { + $(".selectfilter").each(function (index, value) { + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], false); + }); + $(".selectfilterstacked").each(function (index, value) { + var namearr = value.name.split('-'); + SelectFilter.init(value.id, namearr[namearr.length - 1], true); + }); + } + }; + + var initPrepopulatedFields = function (row) { + row.find('.prepopulated_field').each(function () { + var field = $(this), + input = field.find('input, select, textarea'), + dependency_list = input.data('dependency_list') || [], + dependencies = []; + $.each(dependency_list, function (i, field_name) { + dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id')); + }); + if (dependencies.length) { + input.prepopulate(dependencies, input.attr('maxlength')); + } + }); + }; + + $rows.formset({ + prefix: options.prefix, + addText: options.addText, + formCssClass: "dynamic-" + options.prefix, + deleteCssClass: "inline-deletelink", + deleteText: options.deleteText, + emptyCssClass: "empty-form", + removed: updateInlineLabel, + added: function (row) { + initPrepopulatedFields(row); + reinitDateTimeShortCuts(); + updateSelectFilter(); + updateInlineLabel(row); + }, + addButton: options.addButton + }); + + return $rows; + }; + + $(document).ready(function () { + $(".js-inline-admin-formset").each(function () { + var data = $(this).data(), + inlineOptions = data.inlineFormset; + switch (data.inlineType) { + case "stacked": + $(inlineOptions.name + "-group .inline-related").stackedFormset(inlineOptions.options); + break; + case "tabular": + $(inlineOptions.name + "-group .tabular.inline-related tbody:first > tr").tabularFormset(inlineOptions.options); + break; + } + }); + }); +})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/inlines.min.js b/venv/Lib/site-packages/simpleui/static/admin/js/inlines.min.js new file mode 100644 index 0000000..3f50ab9 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/inlines.min.js @@ -0,0 +1,13 @@ +var $jscomp={scope:{},findInternal:function(b,c,a){b instanceof String&&(b=String(b));for(var d=b.length,e=0;e'+a.addText+""),k=c.find("tr:last a")):(d.filter(":last").after('"),k=d.filter(":last").next().find("a")));k.click(function(c){c.preventDefault();c=b("#"+a.prefix+"-empty"); +var d=c.clone(!0);d.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+l);d.is("tr")?d.children(":last").append('"):d.is("ul")||d.is("ol")?d.append('
  • '+a.deleteText+"
  • "):d.children(":first").append(''+a.deleteText+"");d.find("*").each(function(){e(this,a.prefix,f.val())});d.insertBefore(b(c)); +b(f).val(parseInt(f.val(),10)+1);l+=1;""!==h.val()&&0>=h.val()-f.val()&&k.parent().hide();d.find("a."+a.deleteCssClass).click(function(c){c.preventDefault();d.remove();--l;a.removed&&a.removed(d);b(document).trigger("formset:removed",[d,a.prefix]);c=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(c.length);(""===h.val()||0 tr").tabularFormset(a.options)}})})})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/jquery.init.js b/venv/Lib/site-packages/simpleui/static/admin/js/jquery.init.js new file mode 100644 index 0000000..f3ac162 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/jquery.init.js @@ -0,0 +1,8 @@ +/*global django:true, jQuery:false*/ +/* Puts the included jQuery into our own namespace using noConflict and passing + * it 'true'. This ensures that the included jQuery doesn't pollute the global + * namespace (i.e. this preserves pre-existing values for both window.$ and + * window.jQuery). + */ +var django = django || {}; +django.jQuery = jQuery.noConflict(true); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/popup_response.js b/venv/Lib/site-packages/simpleui/static/admin/js/popup_response.js new file mode 100644 index 0000000..418623a --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/popup_response.js @@ -0,0 +1,16 @@ +/*global opener */ +(function () { + 'use strict'; + var initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); + switch (initData.action) { + case 'change': + opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); + break; + case 'delete': + opener.dismissDeleteRelatedObjectPopup(window, initData.value); + break; + default: + opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); + break; + } +})(); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/prepopulate.js b/venv/Lib/site-packages/simpleui/static/admin/js/prepopulate.js new file mode 100644 index 0000000..d2e839c --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/prepopulate.js @@ -0,0 +1,42 @@ +/*global URLify*/ +(function ($) { + 'use strict'; + $.fn.prepopulate = function (dependencies, maxLength, allowUnicode) { + /* + Depends on urlify.js + Populates a selected field with the values of the dependent fields, + URLifies and shortens the string. + dependencies - array of dependent fields ids + maxLength - maximum length of the URLify'd string + allowUnicode - Unicode support of the URLify'd string + */ + return this.each(function () { + var prepopulatedField = $(this); + + var populate = function () { + // Bail if the field's value has been changed by the user + if (prepopulatedField.data('_changed')) { + return; + } + + var values = []; + $.each(dependencies, function (i, field) { + field = $(field); + if (field.val().length > 0) { + values.push(field.val()); + } + }); + prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); + }; + + prepopulatedField.data('_changed', false); + prepopulatedField.change(function () { + prepopulatedField.data('_changed', true); + }); + + if (!prepopulatedField.val()) { + $(dependencies.join(',')).keyup(populate).change(populate).focus(populate); + } + }); + }; +})(django.jQuery); diff --git a/venv/Lib/site-packages/simpleui/static/admin/js/prepopulate.min.js b/venv/Lib/site-packages/simpleui/static/admin/js/prepopulate.min.js new file mode 100644 index 0000000..75f3c17 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/static/admin/js/prepopulate.min.js @@ -0,0 +1 @@ +(function(c){c.fn.prepopulate=function(e,f,g){return this.each(function(){var a=c(this),b=function(){if(!a.data("_changed")){var b=[];c.each(e,function(a,d){d=c(d);0= 0 && j < len ? [this[j]] : []); + }, + + end: function () { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice + }; + + jQuery.extend = jQuery.fn.extend = function () { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if (typeof target === "boolean") { + deep = target; + + // Skip the boolean and the target + target = arguments[i] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if (typeof target !== "object" && !jQuery.isFunction(target)) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if (i === length) { + target = this; + i--; + } + + for (; i < length; i++) { + + // Only deal with non-null/undefined values + if ((options = arguments[i]) != null) { + + // Extend the base object + for (name in options) { + src = target[name]; + copy = options[name]; + + // Prevent never-ending loop + if (target === copy) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if (deep && copy && (jQuery.isPlainObject(copy) || + (copyIsArray = jQuery.isArray(copy)))) { + + if (copyIsArray) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[name] = jQuery.extend(deep, clone, copy); + + // Don't bring in undefined values + } else if (copy !== undefined) { + target[name] = copy; + } + } + } + } + + // Return the modified object + return target; + }; + + jQuery.extend({ + + // Unique for each copy of jQuery on the page + expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function (msg) { + throw new Error(msg); + }, + + noop: function () { + }, + + isFunction: function (obj) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function (obj) { + return obj != null && obj === obj.window; + }, + + isNumeric: function (obj) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0; + }, + + isPlainObject: function (obj) { + var key; + + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if (jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) { + return false; + } + + // Not own constructor property must be Object + if (obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype || {}, "isPrototypeOf")) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own + for (key in obj) { + } + + return key === undefined || hasOwn.call(obj, key); + }, + + isEmptyObject: function (obj) { + var name; + for (name in obj) { + return false; + } + return true; + }, + + type: function (obj) { + if (obj == null) { + return obj + ""; + } + + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[toString.call(obj)] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function (code) { + var script, + indirect = eval; + + code = jQuery.trim(code); + + if (code) { + + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if (code.indexOf("use strict") === 1) { + script = document.createElement("script"); + script.text = code; + document.head.appendChild(script).parentNode.removeChild(script); + } else { + + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + + indirect(code); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function (string) { + return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); + }, + + nodeName: function (elem, name) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function (obj, callback) { + var length, i = 0; + + if (isArrayLike(obj)) { + length = obj.length; + for (; i < length; i++) { + if (callback.call(obj[i], i, obj[i]) === false) { + break; + } + } + } else { + for (i in obj) { + if (callback.call(obj[i], i, obj[i]) === false) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function (text) { + return text == null ? + "" : + (text + "").replace(rtrim, ""); + }, + + // results is for internal usage only + makeArray: function (arr, results) { + var ret = results || []; + + if (arr != null) { + if (isArrayLike(Object(arr))) { + jQuery.merge(ret, + typeof arr === "string" ? + [arr] : arr + ); + } else { + push.call(ret, arr); + } + } + + return ret; + }, + + inArray: function (elem, arr, i) { + return arr == null ? -1 : indexOf.call(arr, elem, i); + }, + + merge: function (first, second) { + var len = +second.length, + j = 0, + i = first.length; + + for (; j < len; j++) { + first[i++] = second[j]; + } + + first.length = i; + + return first; + }, + + grep: function (elems, callback, invert) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for (; i < length; i++) { + callbackInverse = !callback(elems[i], i); + if (callbackInverse !== callbackExpect) { + matches.push(elems[i]); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function (elems, callback, arg) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if (isArrayLike(elems)) { + length = elems.length; + for (; i < length; i++) { + value = callback(elems[i], i, arg); + + if (value != null) { + ret.push(value); + } + } + + // Go through every key on the object, + } else { + for (i in elems) { + value = callback(elems[i], i, arg); + + if (value != null) { + ret.push(value); + } + } + } + + // Flatten any nested arrays + return concat.apply([], ret); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function (fn, context) { + var tmp, args, proxy; + + if (typeof context === "string") { + tmp = fn[context]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if (!jQuery.isFunction(fn)) { + return undefined; + } + + // Simulated bind + args = slice.call(arguments, 2); + proxy = function () { + return fn.apply(context || this, args.concat(slice.call(arguments))); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support + }); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. + /* jshint ignore: start */ + if (typeof Symbol === "function") { + jQuery.fn[Symbol.iterator] = arr[Symbol.iterator]; + } + /* jshint ignore: end */ + +// Populate the class2type map + jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), + function (i, name) { + class2type["[object " + name + "]"] = name.toLowerCase(); + }); + + function isArrayLike(obj) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type(obj); + + if (type === "function" || jQuery.isWindow(obj)) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && (length - 1) in obj; + } + + var Sizzle = + /*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ + (function (window) { + + var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function (a, b) { + if (a === b) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function (list, elem) { + var i = 0, + len = list.length; + for (; i < len; i++) { + if (list[i] === elem) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp(whitespace + "+", "g"), + rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), + + rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), + rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), + + rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"), + + rpseudo = new RegExp(pseudos), + ridentifier = new RegExp("^" + identifier + "$"), + + matchExpr = { + "ID": new RegExp("^#(" + identifier + ")"), + "CLASS": new RegExp("^\\.(" + identifier + ")"), + "TAG": new RegExp("^(" + identifier + "|[*])"), + "ATTR": new RegExp("^" + attributes), + "PSEUDO": new RegExp("^" + pseudos), + "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i"), + "bool": new RegExp("^(?:" + booleans + ")$", "i"), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"), + funescape = function (_, escaped, escapedWhitespace) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode(high + 0x10000) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function () { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) + try { + push.apply( + (arr = slice.call(preferredDoc.childNodes)), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[preferredDoc.childNodes.length].nodeType; + } catch (e) { + push = { + apply: arr.length ? + + // Leverage slice if possible + function (target, els) { + push_native.apply(target, slice.call(els)); + } : + + // Support: IE<9 + // Otherwise append directly + function (target, els) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ((target[j++] = els[i++])) { + } + target.length = j - 1; + } + }; + } + + function Sizzle(selector, context, results, seed) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if (typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if (!seed) { + + if ((context ? context.ownerDocument || context : preferredDoc) !== document) { + setDocument(context); + } + context = context || document; + + if (documentIsHTML) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if (nodeType !== 11 && (match = rquickExpr.exec(selector))) { + + // ID selector + if ((m = match[1])) { + + // Document context + if (nodeType === 9) { + if ((elem = context.getElementById(m))) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if (elem.id === m) { + results.push(elem); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if (newContext && (elem = newContext.getElementById(m)) && + contains(context, elem) && + elem.id === m) { + + results.push(elem); + return results; + } + } + + // Type selector + } else if (match[2]) { + push.apply(results, context.getElementsByTagName(selector)); + return results; + + // Class selector + } else if ((m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName) { + + push.apply(results, context.getElementsByClassName(m)); + return results; + } + } + + // Take advantage of querySelectorAll + if (support.qsa && + !compilerCache[selector + " "] && + (!rbuggyQSA || !rbuggyQSA.test(selector))) { + + if (nodeType !== 1) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if (context.nodeName.toLowerCase() !== "object") { + + // Capture the context ID, setting it first if necessary + if ((nid = context.getAttribute("id"))) { + nid = nid.replace(rescape, "\\$&"); + } else { + context.setAttribute("id", (nid = expando)); + } + + // Prefix every selector in the list + groups = tokenize(selector); + i = groups.length; + nidselect = ridentifier.test(nid) ? "#" + nid : "[id='" + nid + "']"; + while (i--) { + groups[i] = nidselect + " " + toSelector(groups[i]); + } + newSelector = groups.join(","); + + // Expand context for sibling selectors + newContext = rsibling.test(selector) && testContext(context.parentNode) || + context; + } + + if (newSelector) { + try { + push.apply(results, + newContext.querySelectorAll(newSelector) + ); + return results; + } catch (qsaError) { + } finally { + if (nid === expando) { + context.removeAttribute("id"); + } + } + } + } + } + } + + // All others + return select(selector.replace(rtrim, "$1"), context, results, seed); + } + + /** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ + function createCache() { + var keys = []; + + function cache(key, value) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if (keys.push(key + " ") > Expr.cacheLength) { + // Only keep the most recent entries + delete cache[keys.shift()]; + } + return (cache[key + " "] = value); + } + + return cache; + } + + /** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ + function markFunction(fn) { + fn[expando] = true; + return fn; + } + + /** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ + function assert(fn) { + var div = document.createElement("div"); + + try { + return !!fn(div); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if (div.parentNode) { + div.parentNode.removeChild(div); + } + // release memory in IE + div = null; + } + } + + /** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ + function addHandle(attrs, handler) { + var arr = attrs.split("|"), + i = arr.length; + + while (i--) { + Expr.attrHandle[arr[i]] = handler; + } + } + + /** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ + function siblingCheck(a, b) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + (~b.sourceIndex || MAX_NEGATIVE) - + (~a.sourceIndex || MAX_NEGATIVE); + + // Use IE sourceIndex if available on both nodes + if (diff) { + return diff; + } + + // Check if b follows a + if (cur) { + while ((cur = cur.nextSibling)) { + if (cur === b) { + return -1; + } + } + } + + return a ? 1 : -1; + } + + /** + * Returns a function to use in pseudos for input types + * @param {String} type + */ + function createInputPseudo(type) { + return function (elem) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; + } + + /** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ + function createButtonPseudo(type) { + return function (elem) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; + } + + /** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ + function createPositionalPseudo(fn) { + return markFunction(function (argument) { + argument = +argument; + return markFunction(function (seed, matches) { + var j, + matchIndexes = fn([], seed.length, argument), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while (i--) { + if (seed[(j = matchIndexes[i])]) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); + } + + /** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ + function testContext(context) { + return context && typeof context.getElementsByTagName !== "undefined" && context; + } + +// Expose support vars for convenience + support = Sizzle.support = {}; + + /** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ + isXML = Sizzle.isXML = function (elem) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; + }; + + /** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ + setDocument = Sizzle.setDocument = function (node) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if (doc === document || doc.nodeType !== 9 || !doc.documentElement) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML(document); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ((parent = document.defaultView) && parent.top !== parent) { + // Support: IE 11 + if (parent.addEventListener) { + parent.addEventListener("unload", unloadHandler, false); + + // Support: IE 9 - 10 only + } else if (parent.attachEvent) { + parent.attachEvent("onunload", unloadHandler); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function (div) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function (div) { + div.appendChild(document.createComment("")); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test(document.getElementsByClassName); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function (div) { + docElem.appendChild(div).id = expando; + return !document.getElementsByName || !document.getElementsByName(expando).length; + }); + + // ID find and filter + if (support.getById) { + Expr.find["ID"] = function (id, context) { + if (typeof context.getElementById !== "undefined" && documentIsHTML) { + var m = context.getElementById(id); + return m ? [m] : []; + } + }; + Expr.filter["ID"] = function (id) { + var attrId = id.replace(runescape, funescape); + return function (elem) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function (id) { + var attrId = id.replace(runescape, funescape); + return function (elem) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function (tag, context) { + if (typeof context.getElementsByTagName !== "undefined") { + return context.getElementsByTagName(tag); + + // DocumentFragment nodes don't have gEBTN + } else if (support.qsa) { + return context.querySelectorAll(tag); + } + } : + + function (tag, context) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName(tag); + + // Filter out possible comments + if (tag === "*") { + while ((elem = results[i++])) { + if (elem.nodeType === 1) { + tmp.push(elem); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) { + if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) { + return context.getElementsByClassName(className); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ((support.qsa = rnative.test(document.querySelectorAll))) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function (div) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild(div).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if (div.querySelectorAll("[msallowcapture^='']").length) { + rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")"); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if (!div.querySelectorAll("[selected]").length) { + rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if (!div.querySelectorAll("[id~=" + expando + "-]").length) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if (!div.querySelectorAll(":checked").length) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if (!div.querySelectorAll("a#" + expando + "+*").length) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function (div) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute("type", "hidden"); + div.appendChild(input).setAttribute("name", "D"); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if (div.querySelectorAll("[name=d]").length) { + rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?="); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if (!div.querySelectorAll(":enabled").length) { + rbuggyQSA.push(":enabled", ":disabled"); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ((support.matchesSelector = rnative.test((matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector)))) { + + assert(function (div) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call(div, "div"); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call(div, "[s!='']:x"); + rbuggyMatches.push("!=", pseudos); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); + rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test(docElem.compareDocumentPosition); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test(docElem.contains) ? + function (a, b) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!(bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains(bup) : + a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16 + )); + } : + function (a, b) { + if (b) { + while ((b = b.parentNode)) { + if (b === a) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function (a, b) { + + // Flag for duplicate removal + if (a === b) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if (compare) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? + a.compareDocumentPosition(b) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if (compare & 1 || + (!support.sortDetached && b.compareDocumentPosition(a) === compare)) { + + // Choose the first element that is related to our preferred document + if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) { + return -1; + } + if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) { + return 1; + } + + // Maintain original order + return sortInput ? + (indexOf(sortInput, a) - indexOf(sortInput, b)) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function (a, b) { + // Exit early if the nodes are identical + if (a === b) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [a], + bp = [b]; + + // Parentless nodes are either documents or disconnected + if (!aup || !bup) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + (indexOf(sortInput, a) - indexOf(sortInput, b)) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if (aup === bup) { + return siblingCheck(a, b); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ((cur = cur.parentNode)) { + ap.unshift(cur); + } + cur = b; + while ((cur = cur.parentNode)) { + bp.unshift(cur); + } + + // Walk down the tree looking for a discrepancy + while (ap[i] === bp[i]) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck(ap[i], bp[i]) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; + }; + + Sizzle.matches = function (expr, elements) { + return Sizzle(expr, null, null, elements); + }; + + Sizzle.matchesSelector = function (elem, expr) { + // Set document vars if needed + if ((elem.ownerDocument || elem) !== document) { + setDocument(elem); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace(rattributeQuotes, "='$1']"); + + if (support.matchesSelector && documentIsHTML && + !compilerCache[expr + " "] && + (!rbuggyMatches || !rbuggyMatches.test(expr)) && + (!rbuggyQSA || !rbuggyQSA.test(expr))) { + + try { + var ret = matches.call(elem, expr); + + // IE 9's matchesSelector returns false on disconnected nodes + if (ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11) { + return ret; + } + } catch (e) { + } + } + + return Sizzle(expr, document, null, [elem]).length > 0; + }; + + Sizzle.contains = function (context, elem) { + // Set document vars if needed + if ((context.ownerDocument || context) !== document) { + setDocument(context); + } + return contains(context, elem); + }; + + Sizzle.attr = function (elem, name) { + // Set document vars if needed + if ((elem.ownerDocument || elem) !== document) { + setDocument(elem); + } + + var fn = Expr.attrHandle[name.toLowerCase()], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? + fn(elem, name, !documentIsHTML) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute(name) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; + }; + + Sizzle.error = function (msg) { + throw new Error("Syntax error, unrecognized expression: " + msg); + }; + + /** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ + Sizzle.uniqueSort = function (results) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice(0); + results.sort(sortOrder); + + if (hasDuplicate) { + while ((elem = results[i++])) { + if (elem === results[i]) { + j = duplicates.push(i); + } + } + while (j--) { + results.splice(duplicates[j], 1); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; + }; + + /** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ + getText = Sizzle.getText = function (elem) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if (!nodeType) { + // If no nodeType, this is expected to be an array + while ((node = elem[i++])) { + // Do not traverse comment nodes + ret += getText(node); + } + } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if (typeof elem.textContent === "string") { + return elem.textContent; + } else { + // Traverse its children + for (elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText(elem); + } + } + } else if (nodeType === 3 || nodeType === 4) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; + }; + + Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": {dir: "parentNode", first: true}, + " ": {dir: "parentNode"}, + "+": {dir: "previousSibling", first: true}, + "~": {dir: "previousSibling"} + }, + + preFilter: { + "ATTR": function (match) { + match[1] = match[1].replace(runescape, funescape); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape); + + if (match[2] === "~=") { + match[3] = " " + match[3] + " "; + } + + return match.slice(0, 4); + }, + + "CHILD": function (match) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if (match[1].slice(0, 3) === "nth") { + // nth-* requires argument + if (!match[3]) { + Sizzle.error(match[0]); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd")); + match[5] = +((match[7] + match[8]) || match[3] === "odd"); + + // other types prohibit arguments + } else if (match[3]) { + Sizzle.error(match[0]); + } + + return match; + }, + + "PSEUDO": function (match) { + var excess, + unquoted = !match[6] && match[2]; + + if (matchExpr["CHILD"].test(match[0])) { + return null; + } + + // Accept quoted arguments as-is + if (match[3]) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if (unquoted && rpseudo.test(unquoted) && + // Get excess from tokenize (recursively) + (excess = tokenize(unquoted, true)) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { + + // excess is a negative index + match[0] = match[0].slice(0, excess); + match[2] = unquoted.slice(0, excess); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice(0, 3); + } + }, + + filter: { + + "TAG": function (nodeNameSelector) { + var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase(); + return nodeNameSelector === "*" ? + function () { + return true; + } : + function (elem) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function (className) { + var pattern = classCache[className + " "]; + + return pattern || + (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && + classCache(className, function (elem) { + return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || ""); + }); + }, + + "ATTR": function (name, operator, check) { + return function (elem) { + var result = Sizzle.attr(elem, name); + + if (result == null) { + return operator === "!="; + } + if (!operator) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf(check) === 0 : + operator === "*=" ? check && result.indexOf(check) > -1 : + operator === "$=" ? check && result.slice(-check.length) === check : + operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : + operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : + false; + }; + }, + + "CHILD": function (type, what, argument, first, last) { + var simple = type.slice(0, 3) !== "nth", + forward = type.slice(-4) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function (elem) { + return !!elem.parentNode; + } : + + function (elem, context, xml) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if (parent) { + + // :(first|last|only)-(child|of-type) + if (simple) { + while (dir) { + node = elem; + while ((node = node[dir])) { + if (ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [forward ? parent.firstChild : parent.lastChild]; + + // non-xml :nth-child(...) stores cache data on `parent` + if (forward && useCache) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[expando] || (node[expando] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[node.uniqueID] || + (outerCache[node.uniqueID] = {}); + + cache = uniqueCache[type] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = nodeIndex && cache[2]; + node = nodeIndex && parent.childNodes[nodeIndex]; + + while ((node = ++nodeIndex && node && node[dir] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop())) { + + // When found, cache indexes on `parent` and break + if (node.nodeType === 1 && ++diff && node === elem) { + uniqueCache[type] = [dirruns, nodeIndex, diff]; + break; + } + } + + } else { + // Use previously-cached element index if available + if (useCache) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[expando] || (node[expando] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[node.uniqueID] || + (outerCache[node.uniqueID] = {}); + + cache = uniqueCache[type] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if (diff === false) { + // Use the same loop as above to seek `elem` from the start + while ((node = ++nodeIndex && node && node[dir] || + (diff = nodeIndex = 0) || start.pop())) { + + if ((ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1) && + ++diff) { + + // Cache the index of each encountered element + if (useCache) { + outerCache = node[expando] || (node[expando] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[node.uniqueID] || + (outerCache[node.uniqueID] = {}); + + uniqueCache[type] = [dirruns, diff]; + } + + if (node === elem) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || (diff % first === 0 && diff / first >= 0); + } + }; + }, + + "PSEUDO": function (pseudo, argument) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || + Sizzle.error("unsupported pseudo: " + pseudo); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if (fn[expando]) { + return fn(argument); + } + + // But maintain support for old signatures + if (fn.length > 1) { + args = [pseudo, pseudo, "", argument]; + return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? + markFunction(function (seed, matches) { + var idx, + matched = fn(seed, argument), + i = matched.length; + while (i--) { + idx = indexOf(seed, matched[i]); + seed[idx] = !(matches[idx] = matched[i]); + } + }) : + function (elem) { + return fn(elem, 0, args); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function (selector) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile(selector.replace(rtrim, "$1")); + + return matcher[expando] ? + markFunction(function (seed, matches, context, xml) { + var elem, + unmatched = matcher(seed, null, xml, []), + i = seed.length; + + // Match elements unmatched by `matcher` + while (i--) { + if ((elem = unmatched[i])) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function (elem, context, xml) { + input[0] = elem; + matcher(input, null, xml, results); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function (selector) { + return function (elem) { + return Sizzle(selector, elem).length > 0; + }; + }), + + "contains": markFunction(function (text) { + text = text.replace(runescape, funescape); + return function (elem) { + return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction(function (lang) { + // lang value must be a valid identifier + if (!ridentifier.test(lang || "")) { + Sizzle.error("unsupported lang: " + lang); + } + lang = lang.replace(runescape, funescape).toLowerCase(); + return function (elem) { + var elemLang; + do { + if ((elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf(lang + "-") === 0; + } + } while ((elem = elem.parentNode) && elem.nodeType === 1); + return false; + }; + }), + + // Miscellaneous + "target": function (elem) { + var hash = window.location && window.location.hash; + return hash && hash.slice(1) === elem.id; + }, + + "root": function (elem) { + return elem === docElem; + }, + + "focus": function (elem) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function (elem) { + return elem.disabled === false; + }, + + "disabled": function (elem) { + return elem.disabled === true; + }, + + "checked": function (elem) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function (elem) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if (elem.parentNode) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function (elem) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for (elem = elem.firstChild; elem; elem = elem.nextSibling) { + if (elem.nodeType < 6) { + return false; + } + } + return true; + }, + + "parent": function (elem) { + return !Expr.pseudos["empty"](elem); + }, + + // Element/input types + "header": function (elem) { + return rheader.test(elem.nodeName); + }, + + "input": function (elem) { + return rinputs.test(elem.nodeName); + }, + + "button": function (elem) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function (elem) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text"); + }, + + // Position-in-collection + "first": createPositionalPseudo(function () { + return [0]; + }), + + "last": createPositionalPseudo(function (matchIndexes, length) { + return [length - 1]; + }), + + "eq": createPositionalPseudo(function (matchIndexes, length, argument) { + return [argument < 0 ? argument + length : argument]; + }), + + "even": createPositionalPseudo(function (matchIndexes, length) { + var i = 0; + for (; i < length; i += 2) { + matchIndexes.push(i); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function (matchIndexes, length) { + var i = 1; + for (; i < length; i += 2) { + matchIndexes.push(i); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function (matchIndexes, length, argument) { + var i = argument < 0 ? argument + length : argument; + for (; --i >= 0;) { + matchIndexes.push(i); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function (matchIndexes, length, argument) { + var i = argument < 0 ? argument + length : argument; + for (; ++i < length;) { + matchIndexes.push(i); + } + return matchIndexes; + }) + } + }; + + Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos + for (i in {radio: true, checkbox: true, file: true, password: true, image: true}) { + Expr.pseudos[i] = createInputPseudo(i); + } + for (i in {submit: true, reset: true}) { + Expr.pseudos[i] = createButtonPseudo(i); + } + +// Easy API for creating new setFilters + function setFilters() { + } + + setFilters.prototype = Expr.filters = Expr.pseudos; + Expr.setFilters = new setFilters(); + + tokenize = Sizzle.tokenize = function (selector, parseOnly) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[selector + " "]; + + if (cached) { + return parseOnly ? 0 : cached.slice(0); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while (soFar) { + + // Comma and first run + if (!matched || (match = rcomma.exec(soFar))) { + if (match) { + // Don't consume trailing commas as valid + soFar = soFar.slice(match[0].length) || soFar; + } + groups.push((tokens = [])); + } + + matched = false; + + // Combinators + if ((match = rcombinators.exec(soFar))) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace(rtrim, " ") + }); + soFar = soFar.slice(matched.length); + } + + // Filters + for (type in Expr.filter) { + if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || + (match = preFilters[type](match)))) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice(matched.length); + } + } + + if (!matched) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error(selector) : + // Cache the tokens + tokenCache(selector, groups).slice(0); + }; + + function toSelector(tokens) { + var i = 0, + len = tokens.length, + selector = ""; + for (; i < len; i++) { + selector += tokens[i].value; + } + return selector; + } + + function addCombinator(matcher, combinator, base) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function (elem, context, xml) { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + return matcher(elem, context, xml); + } + } + } : + + // Check against all ancestor/preceding elements + function (elem, context, xml) { + var oldCache, uniqueCache, outerCache, + newCache = [dirruns, doneName]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if (xml) { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + if (matcher(elem, context, xml)) { + return true; + } + } + } + } else { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + outerCache = elem[expando] || (elem[expando] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {}); + + if ((oldCache = uniqueCache[dir]) && + oldCache[0] === dirruns && oldCache[1] === doneName) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[2] = oldCache[2]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[dir] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ((newCache[2] = matcher(elem, context, xml))) { + return true; + } + } + } + } + } + }; + } + + function elementMatcher(matchers) { + return matchers.length > 1 ? + function (elem, context, xml) { + var i = matchers.length; + while (i--) { + if (!matchers[i](elem, context, xml)) { + return false; + } + } + return true; + } : + matchers[0]; + } + + function multipleContexts(selector, contexts, results) { + var i = 0, + len = contexts.length; + for (; i < len; i++) { + Sizzle(selector, contexts[i], results); + } + return results; + } + + function condense(unmatched, map, filter, context, xml) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for (; i < len; i++) { + if ((elem = unmatched[i])) { + if (!filter || filter(elem, context, xml)) { + newUnmatched.push(elem); + if (mapped) { + map.push(i); + } + } + } + } + + return newUnmatched; + } + + function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) { + if (postFilter && !postFilter[expando]) { + postFilter = setMatcher(postFilter); + } + if (postFinder && !postFinder[expando]) { + postFinder = setMatcher(postFinder, postSelector); + } + return markFunction(function (seed, results, context, xml) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && (seed || !selector) ? + condense(elems, preMap, preFilter, context, xml) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || (seed ? preFilter : preexisting || postFilter) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if (matcher) { + matcher(matcherIn, matcherOut, context, xml); + } + + // Apply postFilter + if (postFilter) { + temp = condense(matcherOut, postMap); + postFilter(temp, [], context, xml); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while (i--) { + if ((elem = temp[i])) { + matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); + } + } + } + + if (seed) { + if (postFinder || preFilter) { + if (postFinder) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while (i--) { + if ((elem = matcherOut[i])) { + // Restore matcherIn since elem is not yet a final match + temp.push((matcherIn[i] = elem)); + } + } + postFinder(null, (matcherOut = []), temp, xml); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while (i--) { + if ((elem = matcherOut[i]) && + (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice(preexisting, matcherOut.length) : + matcherOut + ); + if (postFinder) { + postFinder(null, results, matcherOut, xml); + } else { + push.apply(results, matcherOut); + } + } + }); + } + + function matcherFromTokens(tokens) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[tokens[0].type], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator(function (elem) { + return elem === checkContext; + }, implicitRelative, true), + matchAnyContext = addCombinator(function (elem) { + return indexOf(checkContext, elem) > -1; + }, implicitRelative, true), + matchers = [function (elem, context, xml) { + var ret = (!leadingRelative && (xml || context !== outermostContext)) || ( + (checkContext = context).nodeType ? + matchContext(elem, context, xml) : + matchAnyContext(elem, context, xml)); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + }]; + + for (; i < len; i++) { + if ((matcher = Expr.relative[tokens[i].type])) { + matchers = [addCombinator(elementMatcher(matchers), matcher)]; + } else { + matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); + + // Return special upon seeing a positional matcher + if (matcher[expando]) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for (; j < len; j++) { + if (Expr.relative[tokens[j].type]) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher(matchers), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice(0, i - 1).concat({value: tokens[i - 2].type === " " ? "*" : ""}) + ).replace(rtrim, "$1"), + matcher, + i < j && matcherFromTokens(tokens.slice(i, j)), + j < len && matcherFromTokens((tokens = tokens.slice(j))), + j < len && toSelector(tokens) + ); + } + matchers.push(matcher); + } + } + + return elementMatcher(matchers); + } + + function matcherFromGroupMatchers(elementMatchers, setMatchers) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function (seed, context, xml, results, outermost) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]("*", outermost), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if (outermost) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for (; i !== len && (elem = elems[i]) != null; i++) { + if (byElement && elem) { + j = 0; + if (!context && elem.ownerDocument !== document) { + setDocument(elem); + xml = !documentIsHTML; + } + while ((matcher = elementMatchers[j++])) { + if (matcher(elem, context || document, xml)) { + results.push(elem); + break; + } + } + if (outermost) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if (bySet) { + // They will have gone through all possible matchers + if ((elem = !matcher && elem)) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if (seed) { + unmatched.push(elem); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if (bySet && i !== matchedCount) { + j = 0; + while ((matcher = setMatchers[j++])) { + matcher(unmatched, setMatched, context, xml); + } + + if (seed) { + // Reintegrate element matches to eliminate the need for sorting + if (matchedCount > 0) { + while (i--) { + if (!(unmatched[i] || setMatched[i])) { + setMatched[i] = pop.call(results); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense(setMatched); + } + + // Add matches to results + push.apply(results, setMatched); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if (outermost && !seed && setMatched.length > 0 && + (matchedCount + setMatchers.length) > 1) { + + Sizzle.uniqueSort(results); + } + } + + // Override manipulation of globals by nested matchers + if (outermost) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction(superMatcher) : + superMatcher; + } + + compile = Sizzle.compile = function (selector, match /* Internal Use Only */) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[selector + " "]; + + if (!cached) { + // Generate a function of recursive functions that can be used to check each element + if (!match) { + match = tokenize(selector); + } + i = match.length; + while (i--) { + cached = matcherFromTokens(match[i]); + if (cached[expando]) { + setMatchers.push(cached); + } else { + elementMatchers.push(cached); + } + } + + // Cache the compiled function + cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; + }; + + /** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ + select = Sizzle.select = function (selector, context, results, seed) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize((selector = compiled.selector || selector)); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if (match.length === 1) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice(0); + if (tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[tokens[1].type]) { + + context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0]; + if (!context) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if (compiled) { + context = context.parentNode; + } + + selector = selector.slice(tokens.shift().value.length); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length; + while (i--) { + token = tokens[i]; + + // Abort if we hit a combinator + if (Expr.relative[(type = token.type)]) { + break; + } + if ((find = Expr.find[type])) { + // Search, expanding context for leading sibling combinators + if ((seed = find( + token.matches[0].replace(runescape, funescape), + rsibling.test(tokens[0].type) && testContext(context.parentNode) || context + ))) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice(i, 1); + selector = seed.length && toSelector(tokens); + if (!selector) { + push.apply(results, seed); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + (compiled || compile(selector, match))( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test(selector) && testContext(context.parentNode) || context + ); + return results; + }; + +// One-time assignments + +// Sort stability + support.sortStable = expando.split("").sort(sortOrder).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function + support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document + setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* + support.sortDetached = assert(function (div1) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition(document.createElement("div")) & 1; + }); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx + if (!assert(function (div) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#"; + })) { + addHandle("type|href|height|width", function (elem, name, isXML) { + if (!isXML) { + return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2); + } + }); + } + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") + if (!support.attributes || !assert(function (div) { + div.innerHTML = ""; + div.firstChild.setAttribute("value", ""); + return div.firstChild.getAttribute("value") === ""; + })) { + addHandle("value", function (elem, name, isXML) { + if (!isXML && elem.nodeName.toLowerCase() === "input") { + return elem.defaultValue; + } + }); + } + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies + if (!assert(function (div) { + return div.getAttribute("disabled") == null; + })) { + addHandle(booleans, function (elem, name, isXML) { + var val; + if (!isXML) { + return elem[name] === true ? name.toLowerCase() : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; + } + }); + } + + return Sizzle; + + })(window); + + + jQuery.find = Sizzle; + jQuery.expr = Sizzle.selectors; + jQuery.expr[":"] = jQuery.expr.pseudos; + jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; + jQuery.text = Sizzle.getText; + jQuery.isXMLDoc = Sizzle.isXML; + jQuery.contains = Sizzle.contains; + + + var dir = function (elem, dir, until) { + var matched = [], + truncate = until !== undefined; + + while ((elem = elem[dir]) && elem.nodeType !== 9) { + if (elem.nodeType === 1) { + if (truncate && jQuery(elem).is(until)) { + break; + } + matched.push(elem); + } + } + return matched; + }; + + + var siblings = function (n, elem) { + var matched = []; + + for (; n; n = n.nextSibling) { + if (n.nodeType === 1 && n !== elem) { + matched.push(n); + } + } + + return matched; + }; + + + var rneedsContext = jQuery.expr.match.needsContext; + + var rsingleTag = (/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/); + + + var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not + function winnow(elements, qualifier, not) { + if (jQuery.isFunction(qualifier)) { + return jQuery.grep(elements, function (elem, i) { + /* jshint -W018 */ + return !!qualifier.call(elem, i, elem) !== not; + }); + + } + + if (qualifier.nodeType) { + return jQuery.grep(elements, function (elem) { + return (elem === qualifier) !== not; + }); + + } + + if (typeof qualifier === "string") { + if (risSimple.test(qualifier)) { + return jQuery.filter(qualifier, elements, not); + } + + qualifier = jQuery.filter(qualifier, elements); + } + + return jQuery.grep(elements, function (elem) { + return (indexOf.call(qualifier, elem) > -1) !== not; + }); + } + + jQuery.filter = function (expr, elems, not) { + var elem = elems[0]; + + if (not) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : + jQuery.find.matches(expr, jQuery.grep(elems, function (elem) { + return elem.nodeType === 1; + })); + }; + + jQuery.fn.extend({ + find: function (selector) { + var i, + len = this.length, + ret = [], + self = this; + + if (typeof selector !== "string") { + return this.pushStack(jQuery(selector).filter(function () { + for (i = 0; i < len; i++) { + if (jQuery.contains(self[i], this)) { + return true; + } + } + })); + } + + for (i = 0; i < len; i++) { + jQuery.find(selector, self[i], ret); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function (selector) { + return this.pushStack(winnow(this, selector || [], false)); + }, + not: function (selector) { + return this.pushStack(winnow(this, selector || [], true)); + }, + is: function (selector) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test(selector) ? + jQuery(selector) : + selector || [], + false + ).length; + } + }); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) + var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function (selector, context, root) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if (!selector) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if (typeof selector === "string") { + if (selector[0] === "<" && + selector[selector.length - 1] === ">" && + selector.length >= 3) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [null, selector, null]; + + } else { + match = rquickExpr.exec(selector); + } + + // Match html or make sure no context is specified for #id + if (match && (match[1] || !context)) { + + // HANDLE: $(html) -> $(array) + if (match[1]) { + context = context instanceof jQuery ? context[0] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge(this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + )); + + // HANDLE: $(html, props) + if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) { + for (match in context) { + + // Properties of context are called as methods if possible + if (jQuery.isFunction(this[match])) { + this[match](context[match]); + + // ...and otherwise set as attributes + } else { + this.attr(match, context[match]); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById(match[2]); + + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if (elem && elem.parentNode) { + + // Inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if (!context || context.jquery) { + return (context || root).find(selector); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor(context).find(selector); + } + + // HANDLE: $(DOMElement) + } else if (selector.nodeType) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if (jQuery.isFunction(selector)) { + return root.ready !== undefined ? + root.ready(selector) : + + // Execute immediately if ready is not present + selector(jQuery); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray(selector, this); + }; + +// Give the init function the jQuery prototype for later instantiation + init.prototype = jQuery.fn; + +// Initialize central reference + rootjQuery = jQuery(document); + + + var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + + jQuery.fn.extend({ + has: function (target) { + var targets = jQuery(target, this), + l = targets.length; + + return this.filter(function () { + var i = 0; + for (; i < l; i++) { + if (jQuery.contains(this, targets[i])) { + return true; + } + } + }); + }, + + closest: function (selectors, context) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? + jQuery(selectors, context || this.context) : + 0; + + for (; i < l; i++) { + for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) { + + // Always skip document fragments + if (cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors))) { + + matched.push(cur); + break; + } + } + } + + return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched); + }, + + // Determine the position of an element within the set + index: function (elem) { + + // No argument, return index in parent + if (!elem) { + return (this[0] && this[0].parentNode) ? this.first().prevAll().length : -1; + } + + // Index in selector + if (typeof elem === "string") { + return indexOf.call(jQuery(elem), this[0]); + } + + // Locate the position of the desired element + return indexOf.call(this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem + ); + }, + + add: function (selector, context) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge(this.get(), jQuery(selector, context)) + ) + ); + }, + + addBack: function (selector) { + return this.add(selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } + }); + + function sibling(cur, dir) { + while ((cur = cur[dir]) && cur.nodeType !== 1) { + } + return cur; + } + + jQuery.each({ + parent: function (elem) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function (elem) { + return dir(elem, "parentNode"); + }, + parentsUntil: function (elem, i, until) { + return dir(elem, "parentNode", until); + }, + next: function (elem) { + return sibling(elem, "nextSibling"); + }, + prev: function (elem) { + return sibling(elem, "previousSibling"); + }, + nextAll: function (elem) { + return dir(elem, "nextSibling"); + }, + prevAll: function (elem) { + return dir(elem, "previousSibling"); + }, + nextUntil: function (elem, i, until) { + return dir(elem, "nextSibling", until); + }, + prevUntil: function (elem, i, until) { + return dir(elem, "previousSibling", until); + }, + siblings: function (elem) { + return siblings((elem.parentNode || {}).firstChild, elem); + }, + children: function (elem) { + return siblings(elem.firstChild); + }, + contents: function (elem) { + return elem.contentDocument || jQuery.merge([], elem.childNodes); + } + }, function (name, fn) { + jQuery.fn[name] = function (until, selector) { + var matched = jQuery.map(this, fn, until); + + if (name.slice(-5) !== "Until") { + selector = until; + } + + if (selector && typeof selector === "string") { + matched = jQuery.filter(selector, matched); + } + + if (this.length > 1) { + + // Remove duplicates + if (!guaranteedUnique[name]) { + jQuery.uniqueSort(matched); + } + + // Reverse order for parents* and prev-derivatives + if (rparentsprev.test(name)) { + matched.reverse(); + } + } + + return this.pushStack(matched); + }; + }); + var rnotwhite = (/\S+/g); + + +// Convert String-formatted options into Object-formatted ones + function createOptions(options) { + var object = {}; + jQuery.each(options.match(rnotwhite) || [], function (_, flag) { + object[flag] = true; + }); + return object; + } + + /* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ + jQuery.Callbacks = function (options) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions(options) : + jQuery.extend({}, options); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function () { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for (; queue.length; firingIndex = -1) { + memory = queue.shift(); + while (++firingIndex < list.length) { + + // Run callback and check for early termination + if (list[firingIndex].apply(memory[0], memory[1]) === false && + options.stopOnFalse) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if (!options.memory) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if (locked) { + + // Keep an empty list if we have data for future add calls + if (memory) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function () { + if (list) { + + // If we have memory from a past run, we should fire after adding + if (memory && !firing) { + firingIndex = list.length - 1; + queue.push(memory); + } + + (function add(args) { + jQuery.each(args, function (_, arg) { + if (jQuery.isFunction(arg)) { + if (!options.unique || !self.has(arg)) { + list.push(arg); + } + } else if (arg && arg.length && jQuery.type(arg) !== "string") { + + // Inspect recursively + add(arg); + } + }); + })(arguments); + + if (memory && !firing) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function () { + jQuery.each(arguments, function (_, arg) { + var index; + while ((index = jQuery.inArray(arg, list, index)) > -1) { + list.splice(index, 1); + + // Handle firing indexes + if (index <= firingIndex) { + firingIndex--; + } + } + }); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function (fn) { + return fn ? + jQuery.inArray(fn, list) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function () { + if (list) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function () { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function () { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function () { + locked = queue = []; + if (!memory) { + list = memory = ""; + } + return this; + }, + locked: function () { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function (context, args) { + if (!locked) { + args = args || []; + args = [context, args.slice ? args.slice() : args]; + queue.push(args); + if (!firing) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function () { + self.fireWith(this, arguments); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function () { + return !!fired; + } + }; + + return self; + }; + + + jQuery.extend({ + + Deferred: function (func) { + var tuples = [ + + // action, add listener, listener list, final state + ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], + ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], + ["notify", "progress", jQuery.Callbacks("memory")] + ], + state = "pending", + promise = { + state: function () { + return state; + }, + always: function () { + deferred.done(arguments).fail(arguments); + return this; + }, + then: function ( /* fnDone, fnFail, fnProgress */) { + var fns = arguments; + return jQuery.Deferred(function (newDefer) { + jQuery.each(tuples, function (i, tuple) { + var fn = jQuery.isFunction(fns[i]) && fns[i]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[tuple[1]](function () { + var returned = fn && fn.apply(this, arguments); + if (returned && jQuery.isFunction(returned.promise)) { + returned.promise() + .progress(newDefer.notify) + .done(newDefer.resolve) + .fail(newDefer.reject); + } else { + newDefer[tuple[0] + "With"]( + this === promise ? newDefer.promise() : this, + fn ? [returned] : arguments + ); + } + }); + }); + fns = null; + }).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function (obj) { + return obj != null ? jQuery.extend(obj, promise) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each(tuples, function (i, tuple) { + var list = tuple[2], + stateString = tuple[3]; + + // promise[ done | fail | progress ] = list.add + promise[tuple[1]] = list.add; + + // Handle state + if (stateString) { + list.add(function () { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[i ^ 1][2].disable, tuples[2][2].lock); + } + + // deferred[ resolve | reject | notify ] + deferred[tuple[0]] = function () { + deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments); + return this; + }; + deferred[tuple[0] + "With"] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise(deferred); + + // Call given func if any + if (func) { + func.call(deferred, deferred); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function (subordinate /* , ..., subordinateN */) { + var i = 0, + resolveValues = slice.call(arguments), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + (subordinate && jQuery.isFunction(subordinate.promise)) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function (i, contexts, values) { + return function (value) { + contexts[i] = this; + values[i] = arguments.length > 1 ? slice.call(arguments) : value; + if (values === progressValues) { + deferred.notifyWith(contexts, values); + } else if (!(--remaining)) { + deferred.resolveWith(contexts, values); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // Add listeners to Deferred subordinates; treat others as resolved + if (length > 1) { + progressValues = new Array(length); + progressContexts = new Array(length); + resolveContexts = new Array(length); + for (; i < length; i++) { + if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) { + resolveValues[i].promise() + .progress(updateFunc(i, progressContexts, progressValues)) + .done(updateFunc(i, resolveContexts, resolveValues)) + .fail(deferred.reject); + } else { + --remaining; + } + } + } + + // If we're not waiting on anything, resolve the master + if (!remaining) { + deferred.resolveWith(resolveContexts, resolveValues); + } + + return deferred.promise(); + } + }); + + +// The deferred used on DOM ready + var readyList; + + jQuery.fn.ready = function (fn) { + + // Add the callback + jQuery.ready.promise().done(fn); + + return this; + }; + + jQuery.extend({ + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function (hold) { + if (hold) { + jQuery.readyWait++; + } else { + jQuery.ready(true); + } + }, + + // Handle when the DOM is ready + ready: function (wait) { + + // Abort if there are pending holds or we're already ready + if (wait === true ? --jQuery.readyWait : jQuery.isReady) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if (wait !== true && --jQuery.readyWait > 0) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith(document, [jQuery]); + + // Trigger any bound ready events + if (jQuery.fn.triggerHandler) { + jQuery(document).triggerHandler("ready"); + jQuery(document).off("ready"); + } + } + }); + + /** + * The ready event handler and self cleanup method + */ + function completed() { + document.removeEventListener("DOMContentLoaded", completed); + window.removeEventListener("load", completed); + jQuery.ready(); + } + + jQuery.ready.promise = function (obj) { + if (!readyList) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE9-10 only + // Older IE sometimes signals "interactive" too soon + if (document.readyState === "complete" || + (document.readyState !== "loading" && !document.documentElement.doScroll)) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout(jQuery.ready); + + } else { + + // Use the handy event callback + document.addEventListener("DOMContentLoaded", completed); + + // A fallback to window.onload, that will always work + window.addEventListener("load", completed); + } + } + return readyList.promise(obj); + }; + +// Kick off the DOM ready check even if the user does not + jQuery.ready.promise(); + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function + var access = function (elems, fn, key, value, chainable, emptyGet, raw) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if (jQuery.type(key) === "object") { + chainable = true; + for (i in key) { + access(elems, fn, i, key[i], true, emptyGet, raw); + } + + // Sets one value + } else if (value !== undefined) { + chainable = true; + + if (!jQuery.isFunction(value)) { + raw = true; + } + + if (bulk) { + + // Bulk operations run against the entire set + if (raw) { + fn.call(elems, value); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function (elem, key, value) { + return bulk.call(jQuery(elem), value); + }; + } + } + + if (fn) { + for (; i < len; i++) { + fn( + elems[i], key, raw ? + value : + value.call(elems[i], i, fn(elems[i], key)) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call(elems) : + len ? fn(elems[0], key) : emptyGet; + }; + var acceptData = function (owner) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !(+owner.nodeType); + }; + + + function Data() { + this.expando = jQuery.expando + Data.uid++; + } + + Data.uid = 1; + + Data.prototype = { + + register: function (owner, initial) { + var value = initial || {}; + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if (owner.nodeType) { + owner[this.expando] = value; + + // Otherwise secure it in a non-enumerable, non-writable property + // configurability must be true to allow the property to be + // deleted with the delete operator + } else { + Object.defineProperty(owner, this.expando, { + value: value, + writable: true, + configurable: true + }); + } + return owner[this.expando]; + }, + cache: function (owner) { + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if (!acceptData(owner)) { + return {}; + } + + // Check if the owner object already has a cache + var value = owner[this.expando]; + + // If not, create one + if (!value) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if (acceptData(owner)) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if (owner.nodeType) { + owner[this.expando] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty(owner, this.expando, { + value: value, + configurable: true + }); + } + } + } + + return value; + }, + set: function (owner, data, value) { + var prop, + cache = this.cache(owner); + + // Handle: [ owner, key, value ] args + if (typeof data === "string") { + cache[data] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for (prop in data) { + cache[prop] = data[prop]; + } + } + return cache; + }, + get: function (owner, key) { + return key === undefined ? + this.cache(owner) : + owner[this.expando] && owner[this.expando][key]; + }, + access: function (owner, key, value) { + var stored; + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if (key === undefined || + ((key && typeof key === "string") && value === undefined)) { + + stored = this.get(owner, key); + + return stored !== undefined ? + stored : this.get(owner, jQuery.camelCase(key)); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set(owner, key, value); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function (owner, key) { + var i, name, camel, + cache = owner[this.expando]; + + if (cache === undefined) { + return; + } + + if (key === undefined) { + this.register(owner); + + } else { + + // Support array or space separated string of keys + if (jQuery.isArray(key)) { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat(key.map(jQuery.camelCase)); + } else { + camel = jQuery.camelCase(key); + + // Try the string as a key before any manipulation + if (key in cache) { + name = [key, camel]; + } else { + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [name] : (name.match(rnotwhite) || []); + } + } + + i = name.length; + + while (i--) { + delete cache[name[i]]; + } + } + + // Remove the expando if there's no more data + if (key === undefined || jQuery.isEmptyObject(cache)) { + + // Support: Chrome <= 35-45+ + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + if (owner.nodeType) { + owner[this.expando] = undefined; + } else { + delete owner[this.expando]; + } + } + }, + hasData: function (owner) { + var cache = owner[this.expando]; + return cache !== undefined && !jQuery.isEmptyObject(cache); + } + }; + var dataPriv = new Data(); + + var dataUser = new Data(); + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + + var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + + function dataAttr(elem, key, data) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if (data === undefined && elem.nodeType === 1) { + name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase(); + data = elem.getAttribute(name); + + if (typeof data === "string") { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test(data) ? jQuery.parseJSON(data) : + data; + } catch (e) { + } + + // Make sure we set the data so it isn't changed later + dataUser.set(elem, key, data); + } else { + data = undefined; + } + } + return data; + } + + jQuery.extend({ + hasData: function (elem) { + return dataUser.hasData(elem) || dataPriv.hasData(elem); + }, + + data: function (elem, name, data) { + return dataUser.access(elem, name, data); + }, + + removeData: function (elem, name) { + dataUser.remove(elem, name); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function (elem, name, data) { + return dataPriv.access(elem, name, data); + }, + + _removeData: function (elem, name) { + dataPriv.remove(elem, name); + } + }); + + jQuery.fn.extend({ + data: function (key, value) { + var i, name, data, + elem = this[0], + attrs = elem && elem.attributes; + + // Gets all values + if (key === undefined) { + if (this.length) { + data = dataUser.get(elem); + + if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) { + i = attrs.length; + while (i--) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if (attrs[i]) { + name = attrs[i].name; + if (name.indexOf("data-") === 0) { + name = jQuery.camelCase(name.slice(5)); + dataAttr(elem, name, data[name]); + } + } + } + dataPriv.set(elem, "hasDataAttrs", true); + } + } + + return data; + } + + // Sets multiple values + if (typeof key === "object") { + return this.each(function () { + dataUser.set(this, key); + }); + } + + return access(this, function (value) { + var data, camelKey; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if (elem && value === undefined) { + + // Attempt to get data from the cache + // with the key as-is + data = dataUser.get(elem, key) || + + // Try to find dashed key if it exists (gh-2779) + // This is for 2.2.x only + dataUser.get(elem, key.replace(rmultiDash, "-$&").toLowerCase()); + + if (data !== undefined) { + return data; + } + + camelKey = jQuery.camelCase(key); + + // Attempt to get data from the cache + // with the key camelized + data = dataUser.get(elem, camelKey); + if (data !== undefined) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr(elem, camelKey, undefined); + if (data !== undefined) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + camelKey = jQuery.camelCase(key); + this.each(function () { + + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = dataUser.get(this, camelKey); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + dataUser.set(this, camelKey, value); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if (key.indexOf("-") > -1 && data !== undefined) { + dataUser.set(this, key, value); + } + }); + }, null, value, arguments.length > 1, null, true); + }, + + removeData: function (key) { + return this.each(function () { + dataUser.remove(this, key); + }); + } + }); + + + jQuery.extend({ + queue: function (elem, type, data) { + var queue; + + if (elem) { + type = (type || "fx") + "queue"; + queue = dataPriv.get(elem, type); + + // Speed up dequeue by getting out quickly if this is just a lookup + if (data) { + if (!queue || jQuery.isArray(data)) { + queue = dataPriv.access(elem, type, jQuery.makeArray(data)); + } else { + queue.push(data); + } + } + return queue || []; + } + }, + + dequeue: function (elem, type) { + type = type || "fx"; + + var queue = jQuery.queue(elem, type), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks(elem, type), + next = function () { + jQuery.dequeue(elem, type); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if (fn === "inprogress") { + fn = queue.shift(); + startLength--; + } + + if (fn) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if (type === "fx") { + queue.unshift("inprogress"); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call(elem, next, hooks); + } + + if (!startLength && hooks) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function (elem, type) { + var key = type + "queueHooks"; + return dataPriv.get(elem, key) || dataPriv.access(elem, key, { + empty: jQuery.Callbacks("once memory").add(function () { + dataPriv.remove(elem, [type + "queue", key]); + }) + }); + } + }); + + jQuery.fn.extend({ + queue: function (type, data) { + var setter = 2; + + if (typeof type !== "string") { + data = type; + type = "fx"; + setter--; + } + + if (arguments.length < setter) { + return jQuery.queue(this[0], type); + } + + return data === undefined ? + this : + this.each(function () { + var queue = jQuery.queue(this, type, data); + + // Ensure a hooks for this queue + jQuery._queueHooks(this, type); + + if (type === "fx" && queue[0] !== "inprogress") { + jQuery.dequeue(this, type); + } + }); + }, + dequeue: function (type) { + return this.each(function () { + jQuery.dequeue(this, type); + }); + }, + clearQueue: function (type) { + return this.queue(type || "fx", []); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function (type, obj) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function () { + if (!(--count)) { + defer.resolveWith(elements, [elements]); + } + }; + + if (typeof type !== "string") { + obj = type; + type = undefined; + } + type = type || "fx"; + + while (i--) { + tmp = dataPriv.get(elements[i], type + "queueHooks"); + if (tmp && tmp.empty) { + count++; + tmp.empty.add(resolve); + } + } + resolve(); + return defer.promise(obj); + } + }); + var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + + var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i"); + + + var cssExpand = ["Top", "Right", "Bottom", "Left"]; + + var isHidden = function (elem, el) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css(elem, "display") === "none" || + !jQuery.contains(elem.ownerDocument, elem); + }; + + + function adjustCSS(elem, prop, valueParts, tween) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function () { + return tween.cur(); + } : + function () { + return jQuery.css(elem, prop, ""); + }, + initial = currentValue(), + unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"), + + // Starting value computation is required for potential unit mismatches + initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) && + rcssNum.exec(jQuery.css(elem, prop)); + + if (initialInUnit && initialInUnit[3] !== unit) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[3]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style(elem, prop, initialInUnit + unit); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== (scale = currentValue() / initial) && scale !== 1 && --maxIterations + ); + } + + if (valueParts) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[1] ? + initialInUnit + (valueParts[1] + 1) * valueParts[2] : + +valueParts[2]; + if (tween) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; + } + + var rcheckableType = (/^(?:checkbox|radio)$/i); + + var rtagName = (/<([\w:-]+)/); + + var rscriptType = (/^$|\/(?:java|ecma)script/i); + + +// We have to close these tags to support XHTML (#13200) + var wrapMap = { + + // Support: IE9 + option: [1, ""], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [1, "", "
    "], + col: [2, "", "
    "], + tr: [2, "", "
    "], + td: [3, "", "
    "], + + _default: [0, "", ""] + }; + +// Support: IE9 + wrapMap.optgroup = wrapMap.option; + + wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; + wrapMap.th = wrapMap.td; + + + function getAll(context, tag) { + + // Support: IE9-11+ + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName(tag || "*") : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll(tag || "*") : + []; + + return tag === undefined || tag && jQuery.nodeName(context, tag) ? + jQuery.merge([context], ret) : + ret; + } + + +// Mark scripts as having already been evaluated + function setGlobalEval(elems, refElements) { + var i = 0, + l = elems.length; + + for (; i < l; i++) { + dataPriv.set( + elems[i], + "globalEval", + !refElements || dataPriv.get(refElements[i], "globalEval") + ); + } + } + + + var rhtml = /<|&#?\w+;/; + + function buildFragment(elems, context, scripts, selection, ignored) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for (; i < l; i++) { + elem = elems[i]; + + if (elem || elem === 0) { + + // Add nodes directly + if (jQuery.type(elem) === "object") { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge(nodes, elem.nodeType ? [elem] : elem); + + // Convert non-html into a text node + } else if (!rhtml.test(elem)) { + nodes.push(context.createTextNode(elem)); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild(context.createElement("div")); + + // Deserialize a standard representation + tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); + wrap = wrapMap[tag] || wrapMap._default; + tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while (j--) { + tmp = tmp.lastChild; + } + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge(nodes, tmp.childNodes); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ((elem = nodes[i++])) { + + // Skip elements already in the context collection (trac-4087) + if (selection && jQuery.inArray(elem, selection) > -1) { + if (ignored) { + ignored.push(elem); + } + continue; + } + + contains = jQuery.contains(elem.ownerDocument, elem); + + // Append to fragment + tmp = getAll(fragment.appendChild(elem), "script"); + + // Preserve script evaluation history + if (contains) { + setGlobalEval(tmp); + } + + // Capture executables + if (scripts) { + j = 0; + while ((elem = tmp[j++])) { + if (rscriptType.test(elem.type || "")) { + scripts.push(elem); + } + } + } + } + + return fragment; + } + + + (function () { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild(document.createElement("div")), + input = document.createElement("input"); + + // Support: Android 4.0-4.3, Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute("type", "radio"); + input.setAttribute("checked", "checked"); + input.setAttribute("name", "t"); + + div.appendChild(input); + + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked; + + // Support: IE<=11+ + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue; + })(); + + + var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + + function returnTrue() { + return true; + } + + function returnFalse() { + return false; + } + +// Support: IE9 +// See #13393 for more info + function safeActiveElement() { + try { + return document.activeElement; + } catch (err) { + } + } + + function on(elem, types, selector, data, fn, one) { + var origFn, type; + + // Types can be a map of types/handlers + if (typeof types === "object") { + + // ( types-Object, selector, data ) + if (typeof selector !== "string") { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for (type in types) { + on(elem, type, selector, data, types[type], one); + } + return elem; + } + + if (data == null && fn == null) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if (fn == null) { + if (typeof selector === "string") { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if (fn === false) { + fn = returnFalse; + } else if (!fn) { + return elem; + } + + if (one === 1) { + origFn = fn; + fn = function (event) { + + // Can use an empty set, since event contains the info + jQuery().off(event); + return origFn.apply(this, arguments); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); + } + return elem.each(function () { + jQuery.event.add(this, types, fn, data, selector); + }); + } + + /* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ + jQuery.event = { + + global: {}, + + add: function (elem, types, handler, data, selector) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get(elem); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if (!elemData) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if (handler.handler) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if (!handler.guid) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if (!(events = elemData.events)) { + events = elemData.events = {}; + } + if (!(eventHandle = elemData.handle)) { + eventHandle = elemData.handle = function (e) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply(elem, arguments) : undefined; + }; + } + + // Handle multiple events separated by a space + types = (types || "").match(rnotwhite) || [""]; + t = types.length; + while (t--) { + tmp = rtypenamespace.exec(types[t]) || []; + type = origType = tmp[1]; + namespaces = (tmp[2] || "").split(".").sort(); + + // There *must* be a type, no attaching namespace-only handlers + if (!type) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[type] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = (selector ? special.delegateType : special.bindType) || type; + + // Update special based on newly reset type + special = jQuery.event.special[type] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test(selector), + namespace: namespaces.join(".") + }, handleObjIn); + + // Init the event handler queue if we're the first + if (!(handlers = events[type])) { + handlers = events[type] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if (!special.setup || + special.setup.call(elem, data, namespaces, eventHandle) === false) { + + if (elem.addEventListener) { + elem.addEventListener(type, eventHandle); + } + } + } + + if (special.add) { + special.add.call(elem, handleObj); + + if (!handleObj.handler.guid) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if (selector) { + handlers.splice(handlers.delegateCount++, 0, handleObj); + } else { + handlers.push(handleObj); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[type] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function (elem, types, handler, selector, mappedTypes) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData(elem) && dataPriv.get(elem); + + if (!elemData || !(events = elemData.events)) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = (types || "").match(rnotwhite) || [""]; + t = types.length; + while (t--) { + tmp = rtypenamespace.exec(types[t]) || []; + type = origType = tmp[1]; + namespaces = (tmp[2] || "").split(".").sort(); + + // Unbind all events (on this namespace, if provided) for the element + if (!type) { + for (type in events) { + jQuery.event.remove(elem, type + types[t], handler, selector, true); + } + continue; + } + + special = jQuery.event.special[type] || {}; + type = (selector ? special.delegateType : special.bindType) || type; + handlers = events[type] || []; + tmp = tmp[2] && + new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); + + // Remove matching events + origCount = j = handlers.length; + while (j--) { + handleObj = handlers[j]; + + if ((mappedTypes || origType === handleObj.origType) && + (!handler || handler.guid === handleObj.guid) && + (!tmp || tmp.test(handleObj.namespace)) && + (!selector || selector === handleObj.selector || + selector === "**" && handleObj.selector)) { + handlers.splice(j, 1); + + if (handleObj.selector) { + handlers.delegateCount--; + } + if (special.remove) { + special.remove.call(elem, handleObj); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if (origCount && !handlers.length) { + if (!special.teardown || + special.teardown.call(elem, namespaces, elemData.handle) === false) { + + jQuery.removeEvent(elem, type, elemData.handle); + } + + delete events[type]; + } + } + + // Remove data and the expando if it's no longer used + if (jQuery.isEmptyObject(events)) { + dataPriv.remove(elem, "handle events"); + } + }, + + dispatch: function (event) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix(event); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call(arguments), + handlers = (dataPriv.get(this, "events") || {})[event.type] || [], + special = jQuery.event.special[event.type] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if (special.preDispatch && special.preDispatch.call(this, event) === false) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call(this, event, handlers); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { + event.currentTarget = matched.elem; + + j = 0; + while ((handleObj = matched.handlers[j++]) && + !event.isImmediatePropagationStopped()) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ((jQuery.event.special[handleObj.origType] || {}).handle || + handleObj.handler).apply(matched.elem, args); + + if (ret !== undefined) { + if ((event.result = ret) === false) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if (special.postDispatch) { + special.postDispatch.call(this, event); + } + + return event.result; + }, + + handlers: function (event, handlers) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if (delegateCount && cur.nodeType && + (event.type !== "click" || isNaN(event.button) || event.button < 1)) { + + for (; cur !== this; cur = cur.parentNode || this) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) { + matches = []; + for (i = 0; i < delegateCount; i++) { + handleObj = handlers[i]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if (matches[sel] === undefined) { + matches[sel] = handleObj.needsContext ? + jQuery(sel, this).index(cur) > -1 : + jQuery.find(sel, this, null, [cur]).length; + } + if (matches[sel]) { + matches.push(handleObj); + } + } + if (matches.length) { + handlerQueue.push({elem: cur, handlers: matches}); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if (delegateCount < handlers.length) { + handlerQueue.push({elem: this, handlers: handlers.slice(delegateCount)}); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ("altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which").split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function (event, original) { + + // Add which for key events + if (event.which == null) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ("button buttons clientX clientY offsetX offsetY pageX pageY " + + "screenX screenY toElement").split(" "), + filter: function (event, original) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if (event.pageX == null && original.clientX != null) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - + (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = original.clientY + + (doc && doc.scrollTop || body && body.scrollTop || 0) - + (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if (!event.which && button !== undefined) { + event.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); + } + + return event; + } + }, + + fix: function (event) { + if (event[jQuery.expando]) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[type]; + + if (!fixHook) { + this.fixHooks[type] = fixHook = + rmouseEvent.test(type) ? this.mouseHooks : + rkeyEvent.test(type) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat(fixHook.props) : this.props; + + event = new jQuery.Event(originalEvent); + + i = copy.length; + while (i--) { + prop = copy[i]; + event[prop] = originalEvent[prop]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if (!event.target) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if (event.target.nodeType === 3) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter(event, originalEvent) : event; + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function () { + if (this !== safeActiveElement() && this.focus) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function () { + if (this === safeActiveElement() && this.blur) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function () { + if (this.type === "checkbox" && this.click && jQuery.nodeName(this, "input")) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function (event) { + return jQuery.nodeName(event.target, "a"); + } + }, + + beforeunload: { + postDispatch: function (event) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if (event.result !== undefined && event.originalEvent) { + event.originalEvent.returnValue = event.result; + } + } + } + } + }; + + jQuery.removeEvent = function (elem, type, handle) { + + // This "if" is needed for plain objects + if (elem.removeEventListener) { + elem.removeEventListener(type, handle); + } + }; + + jQuery.Event = function (src, props) { + + // Allow instantiation without the 'new' keyword + if (!(this instanceof jQuery.Event)) { + return new jQuery.Event(src, props); + } + + // Event object + if (src && src.type) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android<4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if (props) { + jQuery.extend(this, props); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[jQuery.expando] = true; + }; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html + jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function () { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if (e) { + e.preventDefault(); + } + }, + stopPropagation: function () { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if (e) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function () { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if (e) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } + }; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). + jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" + }, function (orig, fix) { + jQuery.event.special[orig] = { + delegateType: fix, + bindType: fix, + + handle: function (event) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if (!related || (related !== target && !jQuery.contains(target, related))) { + event.type = handleObj.origType; + ret = handleObj.handler.apply(this, arguments); + event.type = fix; + } + return ret; + } + }; + }); + + jQuery.fn.extend({ + on: function (types, selector, data, fn) { + return on(this, types, selector, data, fn); + }, + one: function (types, selector, data, fn) { + return on(this, types, selector, data, fn, 1); + }, + off: function (types, selector, fn) { + var handleObj, type; + if (types && types.preventDefault && types.handleObj) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery(types.delegateTarget).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if (typeof types === "object") { + + // ( types-object [, selector] ) + for (type in types) { + this.off(type, selector, types[type]); + } + return this; + } + if (selector === false || typeof selector === "function") { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if (fn === false) { + fn = returnFalse; + } + return this.each(function () { + jQuery.event.remove(this, types, fn, selector); + }); + } + }); + + + var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Manipulating tables requires a tbody + function manipulationTarget(elem, content) { + return jQuery.nodeName(elem, "table") && + jQuery.nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr") ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody")) : + elem; + } + +// Replace/restore the type attribute of script elements for safe DOM manipulation + function disableScript(elem) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; + } + + function restoreScript(elem) { + var match = rscriptTypeMasked.exec(elem.type); + + if (match) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + + return elem; + } + + function cloneCopyEvent(src, dest) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if (dest.nodeType !== 1) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if (dataPriv.hasData(src)) { + pdataOld = dataPriv.access(src); + pdataCur = dataPriv.set(dest, pdataOld); + events = pdataOld.events; + + if (events) { + delete pdataCur.handle; + pdataCur.events = {}; + + for (type in events) { + for (i = 0, l = events[type].length; i < l; i++) { + jQuery.event.add(dest, type, events[type][i]); + } + } + } + } + + // 2. Copy user data + if (dataUser.hasData(src)) { + udataOld = dataUser.access(src); + udataCur = jQuery.extend({}, udataOld); + + dataUser.set(dest, udataCur); + } + } + +// Fix IE bugs, see support tests + function fixInput(src, dest) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if (nodeName === "input" && rcheckableType.test(src.type)) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if (nodeName === "input" || nodeName === "textarea") { + dest.defaultValue = src.defaultValue; + } + } + + function domManip(collection, args, callback, ignored) { + + // Flatten any nested arrays + args = concat.apply([], args); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction(value); + + // We can't cloneNode fragments that contain checked, in WebKit + if (isFunction || + (l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test(value))) { + return collection.each(function (index) { + var self = collection.eq(index); + if (isFunction) { + args[0] = value.call(this, index, self.html()); + } + domManip(self, args, callback, ignored); + }); + } + + if (l) { + fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored); + first = fragment.firstChild; + + if (fragment.childNodes.length === 1) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if (first || ignored) { + scripts = jQuery.map(getAll(fragment, "script"), disableScript); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for (; i < l; i++) { + node = fragment; + + if (i !== iNoClone) { + node = jQuery.clone(node, true, true); + + // Keep references to cloned scripts for later restoration + if (hasScripts) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge(scripts, getAll(node, "script")); + } + } + + callback.call(collection[i], node, i); + } + + if (hasScripts) { + doc = scripts[scripts.length - 1].ownerDocument; + + // Reenable scripts + jQuery.map(scripts, restoreScript); + + // Evaluate executable scripts on first document insertion + for (i = 0; i < hasScripts; i++) { + node = scripts[i]; + if (rscriptType.test(node.type || "") && + !dataPriv.access(node, "globalEval") && + jQuery.contains(doc, node)) { + + if (node.src) { + + // Optional AJAX dependency, but won't run scripts if not present + if (jQuery._evalUrl) { + jQuery._evalUrl(node.src); + } + } else { + jQuery.globalEval(node.textContent.replace(rcleanScript, "")); + } + } + } + } + } + } + + return collection; + } + + function remove(elem, selector, keepData) { + var node, + nodes = selector ? jQuery.filter(selector, elem) : elem, + i = 0; + + for (; (node = nodes[i]) != null; i++) { + if (!keepData && node.nodeType === 1) { + jQuery.cleanData(getAll(node)); + } + + if (node.parentNode) { + if (keepData && jQuery.contains(node.ownerDocument, node)) { + setGlobalEval(getAll(node, "script")); + } + node.parentNode.removeChild(node); + } + } + + return elem; + } + + jQuery.extend({ + htmlPrefilter: function (html) { + return html.replace(rxhtmlTag, "<$1>"); + }, + + clone: function (elem, dataAndEvents, deepDataAndEvents) { + var i, l, srcElements, destElements, + clone = elem.cloneNode(true), + inPage = jQuery.contains(elem.ownerDocument, elem); + + // Fix IE cloning issues + if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && + !jQuery.isXMLDoc(elem)) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll(clone); + srcElements = getAll(elem); + + for (i = 0, l = srcElements.length; i < l; i++) { + fixInput(srcElements[i], destElements[i]); + } + } + + // Copy the events from the original to the clone + if (dataAndEvents) { + if (deepDataAndEvents) { + srcElements = srcElements || getAll(elem); + destElements = destElements || getAll(clone); + + for (i = 0, l = srcElements.length; i < l; i++) { + cloneCopyEvent(srcElements[i], destElements[i]); + } + } else { + cloneCopyEvent(elem, clone); + } + } + + // Preserve script evaluation history + destElements = getAll(clone, "script"); + if (destElements.length > 0) { + setGlobalEval(destElements, !inPage && getAll(elem, "script")); + } + + // Return the cloned set + return clone; + }, + + cleanData: function (elems) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for (; (elem = elems[i]) !== undefined; i++) { + if (acceptData(elem)) { + if ((data = elem[dataPriv.expando])) { + if (data.events) { + for (type in data.events) { + if (special[type]) { + jQuery.event.remove(elem, type); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent(elem, type, data.handle); + } + } + } + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[dataPriv.expando] = undefined; + } + if (elem[dataUser.expando]) { + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[dataUser.expando] = undefined; + } + } + } + } + }); + + jQuery.fn.extend({ + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function (selector) { + return remove(this, selector, true); + }, + + remove: function (selector) { + return remove(this, selector); + }, + + text: function (value) { + return access(this, function (value) { + return value === undefined ? + jQuery.text(this) : + this.empty().each(function () { + if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { + this.textContent = value; + } + }); + }, null, value, arguments.length); + }, + + append: function () { + return domManip(this, arguments, function (elem) { + if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { + var target = manipulationTarget(this, elem); + target.appendChild(elem); + } + }); + }, + + prepend: function () { + return domManip(this, arguments, function (elem) { + if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { + var target = manipulationTarget(this, elem); + target.insertBefore(elem, target.firstChild); + } + }); + }, + + before: function () { + return domManip(this, arguments, function (elem) { + if (this.parentNode) { + this.parentNode.insertBefore(elem, this); + } + }); + }, + + after: function () { + return domManip(this, arguments, function (elem) { + if (this.parentNode) { + this.parentNode.insertBefore(elem, this.nextSibling); + } + }); + }, + + empty: function () { + var elem, + i = 0; + + for (; (elem = this[i]) != null; i++) { + if (elem.nodeType === 1) { + + // Prevent memory leaks + jQuery.cleanData(getAll(elem, false)); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function (dataAndEvents, deepDataAndEvents) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function () { + return jQuery.clone(this, dataAndEvents, deepDataAndEvents); + }); + }, + + html: function (value) { + return access(this, function (value) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if (value === undefined && elem.nodeType === 1) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if (typeof value === "string" && !rnoInnerhtml.test(value) && + !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) { + + value = jQuery.htmlPrefilter(value); + + try { + for (; i < l; i++) { + elem = this[i] || {}; + + // Remove element nodes and prevent memory leaks + if (elem.nodeType === 1) { + jQuery.cleanData(getAll(elem, false)); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch (e) { + } + } + + if (elem) { + this.empty().append(value); + } + }, null, value, arguments.length); + }, + + replaceWith: function () { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip(this, arguments, function (elem) { + var parent = this.parentNode; + + if (jQuery.inArray(this, ignored) < 0) { + jQuery.cleanData(getAll(this)); + if (parent) { + parent.replaceChild(elem, this); + } + } + + // Force callback invocation + }, ignored); + } + }); + + jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, function (name, original) { + jQuery.fn[name] = function (selector) { + var elems, + ret = [], + insert = jQuery(selector), + last = insert.length - 1, + i = 0; + + for (; i <= last; i++) { + elems = i === last ? this : this.clone(true); + jQuery(insert[i])[original](elems); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply(ret, elems.get()); + } + + return this.pushStack(ret); + }; + }); + + + var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + + /** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay + function actualDisplay(name, doc) { + var elem = jQuery(doc.createElement(name)).appendTo(doc.body), + + display = jQuery.css(elem[0], "display"); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; + } + + /** + * Try to determine the default display value of an element + * @param {String} nodeName + */ + function defaultDisplay(nodeName) { + var doc = document, + display = elemdisplay[nodeName]; + + if (!display) { + display = actualDisplay(nodeName, doc); + + // If the simple way fails, read from inside an iframe + if (display === "none" || !display) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery(" + + {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} + + {% trans "History" %} + + + {% if has_absolute_url %} +
  • + {% trans "View on site" %} +
  • + {% endif %} + {% endblock %} +
+ {% endif %}{% endif %} + {% endblock %} +
{% csrf_token %}{% block form_top %}{% endblock %} +
+ {% if is_popup %}{% endif %} + {% if to_field %}{% endif %} + {% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} + {% if errors %} +
+ + +
+ {{ adminform.form.non_field_errors }} + {% endif %} + + {% block field_sets %} + {% for fieldset in adminform %} + {% include "admin/includes/fieldset.html" %} + {% endfor %} + {% endblock %} + + {% block after_field_sets %}{% endblock %} + + {% block inline_field_sets %} + {% for inline_admin_formset in inline_admin_formsets %} + {% include inline_admin_formset.opts.template %} + {% endfor %} + {% endblock %} + + {% block after_related_objects %}{% endblock %} + + {% block submit_buttons_bottom %}{% submit_row %}{% endblock %} + + {% block admin_change_form_document_ready %} + + {% endblock %} + + {# JavaScript for prepopulated fields #} + {% prepopulated_fields_js %} + +
+
+ +
+ +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/admin/change_form_object_tools.html b/venv/Lib/site-packages/simpleui/templates/admin/change_form_object_tools.html new file mode 100644 index 0000000..3248749 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/change_form_object_tools.html @@ -0,0 +1,8 @@ +{% load i18n admin_urls %} +{% block object-tools-items %} +
  • + {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} + {% trans "History" %} +
  • +{% if has_absolute_url %}
  • {% trans "View on site" %}
  • {% endif %} +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/admin/change_list.html b/venv/Lib/site-packages/simpleui/templates/admin/change_list.html new file mode 100644 index 0000000..2ff8a16 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/change_list.html @@ -0,0 +1,116 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls static admin_list %} + +{% block extrastyle %} + {{ block.super }} + + + {% if cl.formset %} + + {% endif %} + {% if cl.formset or action_form %} + + {% endif %} + {{ media.css }} + {% if not actions_on_top and not actions_on_bottom %} + + {% endif %} +{% endblock %} + +{% block extrahead %} + {{ block.super }} + {{ media.js }} +{% endblock %} + +{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %} + +{% if not is_popup %} + {% block breadcrumbs %} + + {% endblock %} +{% endif %} + +{% block coltype %}flex{% endblock %} +{% block content_title %} + +{% endblock %} +{% block content %} + + {% block object-tools %} + + {% endblock %} + +
    + + {% if cl.formset.errors %} +

    + {% if cl.formset.total_error_count == 1 %}{% trans "Please correct the error below." %}{% else %} + {% trans "Please correct the errors below." %}{% endif %} +

    + {{ cl.formset.non_form_errors }} + {% endif %} +
    + {% block search %}{% search_form cl %}{% endblock %} + {% block date_hierarchy %}{% date_hierarchy cl %}{% endblock %} + +
    {% csrf_token %} + {% if cl.formset %} +
    {{ cl.formset.management_form }}
    + {% endif %} + + {% block result_list %} + + {# {% if action_form %}#} + {% admin_actions %} + {# {% endif %}#} + + {% result_list cl %} + + {% endblock %} + {% block pagination %}{% pagination cl %}{% endblock %} +
    +
    +
    + +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/admin/change_list_object_tools.html b/venv/Lib/site-packages/simpleui/templates/admin/change_list_object_tools.html new file mode 100644 index 0000000..5d6d458 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/change_list_object_tools.html @@ -0,0 +1,12 @@ +{% load i18n admin_urls %} + +{% block object-tools-items %} + {% if has_add_permission %} +
  • + {% url cl.opts|admin_urlname:'add' as add_url %} + + {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} + +
  • + {% endif %} +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/admin/change_list_results.html b/venv/Lib/site-packages/simpleui/templates/admin/change_list_results.html new file mode 100644 index 0000000..2491bd8 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/change_list_results.html @@ -0,0 +1,50 @@ +{% load i18n static simpletags %} +{% if result_hidden_fields %} +
    {# DIV for HTML validation #} + {% for item in result_hidden_fields %}{{ item }}{% endfor %} +
    +{% endif %} +{#{% if results %}#} +
    + + + + {% for header in result_headers %} + {% endfor %} + + + + {% for result in results %} + {% if result.form.non_field_errors %} + + + + {% endif %} + + {% for item in result %} + {{ item }} + {% endfor %} + + {% endfor %} + +
    + {% if header.sortable %} + {% if header.sort_priority > 0 %} +
    + + {% if num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %} + +
    + {% endif %} + {% endif %} +
    {% if header.sortable %} + {{ header.text|capfirst }}{% else %} + {{ header.text|capfirst }}{% endif %}
    +
    +
    {{ result.form.non_field_errors }}
    +
    +{#{% endif %}#} diff --git a/venv/Lib/site-packages/simpleui/templates/admin/date_hierarchy.html b/venv/Lib/site-packages/simpleui/templates/admin/date_hierarchy.html new file mode 100644 index 0000000..0058510 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/date_hierarchy.html @@ -0,0 +1,10 @@ +{% if show %} +
    +
    +
    +{% endif %} diff --git a/venv/Lib/site-packages/simpleui/templates/admin/filter.html b/venv/Lib/site-packages/simpleui/templates/admin/filter.html new file mode 100644 index 0000000..cd88652 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/filter.html @@ -0,0 +1,8 @@ +{% load i18n %} +

    {% blocktrans with filter_title=title %} By {{ filter_title }} {% endblocktrans %}

    + diff --git a/venv/Lib/site-packages/simpleui/templates/admin/home.html b/venv/Lib/site-packages/simpleui/templates/admin/home.html new file mode 100644 index 0000000..39bcf98 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/home.html @@ -0,0 +1,119 @@ +{% load i18n static simpletags %} + +
    + + + + {% if "SIMPLEUI_HOME_QUICK"|get_config != False%} + + {% if "SIMPLEUI_HOME_INFO"|get_config != False %} + + {% else %} + + {% endif %} + + +
    + + +
    +
    + {% if "SIMPLEUI_HOME_QUICK"|get_config != False %} + + + + + {% endif %} +
    +
    +
    + {% endif %} + + {% if "SIMPLEUI_HOME_INFO"|get_config != False %} + + +
    + + Simpleui + +
    +
    +
    + {% get_app_info %} + +
    + Gitee + + + Github + +
    +
    +
    + + {% endif %} +
    + + + {% if "SIMPLEUI_HOME_ACTION"|get_config != False %} + +
    + {% trans 'Recent actions' %} + +
    + {% load log %} + {% get_admin_log 10 as admin_log for_user user %} + {% if admin_log %} + +
    + + {% for entry in admin_log %} + + +

    {{ entry.user }} {{ entry.action_time }}

    +

    {{ entry.content_type }}: {{ entry }}

    +
    +
    + {% endfor %} +
    +
    +
    + {% endif %} +
    + {% endif %} +
    + + + + +
    +
    +

    + Run Command: +

    + + + +
    +

    Change logs:

    +
    +
    +
    \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/templates/admin/includes/css-part.html b/venv/Lib/site-packages/simpleui/templates/admin/includes/css-part.html new file mode 100644 index 0000000..e16e456 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/includes/css-part.html @@ -0,0 +1,8 @@ +{% load static simpletags %} +{% if "SIMPLEUI_STATIC_OFFLINE"|get_config %} + + +{% else %} + + +{% endif %} \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/templates/admin/includes/fieldset.html b/venv/Lib/site-packages/simpleui/templates/admin/includes/fieldset.html new file mode 100644 index 0000000..c913b22 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/includes/fieldset.html @@ -0,0 +1,219 @@ +
    + {% if fieldset.name %}

    {{ fieldset.name }}

    {% endif %} + {% if fieldset.description %} +
    {{ fieldset.description|safe }}
    + {% endif %} + {% for line in fieldset %} +
    + {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %} + {% for field in line %} + + {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %} + {% if field.is_checkbox %} + {{ field.field }}{{ field.label_tag }} + {% else %} + {{ field.label_tag }} + {% if field.is_readonly %} +
    {{ field.contents }}
    + {% else %} + {{ field.field }} + {% endif %} + {% endif %} + {% if field.field.help_text %} +
    {{ field.field.help_text|safe }}
    + {% endif %} +
    + {% endfor %} +
    + {% endfor %} + + + + + + + + + \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/templates/admin/includes/js-part.html b/venv/Lib/site-packages/simpleui/templates/admin/includes/js-part.html new file mode 100644 index 0000000..7b1c7cc --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/includes/js-part.html @@ -0,0 +1,8 @@ +{% load static simpletags %} +{% if "SIMPLEUI_STATIC_OFFLINE"|get_config %} + + +{% else %} + + +{% endif %} \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/templates/admin/index.html b/venv/Lib/site-packages/simpleui/templates/admin/index.html new file mode 100644 index 0000000..d2f9c93 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/index.html @@ -0,0 +1,377 @@ + +{% load i18n static %} +{% load simpletags %} +{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} + + + + + + + + {% block title %} + {{ site_title }} + {% endblock %} + + {% block icon %} + {% endblock %} + + {% block css %} + {% include 'admin/includes/css-part.html' %} + + + {% endblock %} + {% block head %} + + {% endblock %} + + + + + +{% verbatim dynamicCss %} +{% endverbatim dynamicCss %} + +{% block menus %} + {% autoescape off %} + {% menus %} + {% endautoescape %} +{% endblock %} +
    + {% block theme_css %} + + + {% if "SIMPLEUI_DEFAULT_THEME"|get_config %} + + {% endif %} + {% endblock %} + + +
    + + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + {% block logo %} +
    +
    +
    + {% if "SIMPLEUI_LOGO"|get_config %} + + {% else %} + + {% endif %} +
    +
    + {{ site_header }} +
    +
    +
    + {% endblock %} + + +
    + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + {% block header %} + +
    +
    + + {% block breadcrumb %} + + {% verbatim myclode %} + {{ menus[0].name }} + + + + + + {% endverbatim myclode %} + + {% endblock %} +
    + +
    + + + + + {% verbatim mycode %} + + + + + + {% endverbatim mycode %} + + + + {{ user }} + + + + {% verbatim mycode %} + {{ language.change_password }} + + {% endverbatim mycode %} + {% has_enable_admindoc as has_admindoc %} + {% if has_admindoc %} + {% trans 'Documentation' %} + {% endif %} + + {% verbatim mycode %} + {{ language.logout }} + {% endverbatim mycode %} + + +
    +
    +
    + {% endblock %} + + + + + + {% home_page %} + + {% if home %} + {{ title }} + + + {% else %} + + {% endif %} + + {% block tab-item %} + + + {% endblock %} + + +
    + {% if home %} + + {% else %} + {% include './home.html' %} + {% endif %} +
    +
    + + {% if "SIMPLEUI_LOADING"|get_config != False %} +
    +
    + + loading... +
    +
    + {% endif %} + +
    +
    + + +
    +
    +
    +
    + + + + + + + {% block theme_dialog %} + + {% block theme_body %} +
    +
    +
    + +
    +
    +
    +
    + {% endblock %} +
    + {% endblock %} + + {% block font_dialog %} + + +
    + +
    +
    + {% endblock %} +
    +{% block base_script %} + + + {% include 'admin/includes/js-part.html' %} + + + + + + + + + + {% block index_js %} + + {% endblock %} + {% block autoupdate %} + + {% endblock %} +{% endblock %} +{% load_analysis %} +{% block script %} + {# 预留脚本block 可以实现基础该页面,添加自定义脚本#} +{% endblock %} + + \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/templates/admin/invalid_setup.html b/venv/Lib/site-packages/simpleui/templates/admin/invalid_setup.html new file mode 100644 index 0000000..7c71107 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/invalid_setup.html @@ -0,0 +1,13 @@ +{% extends "admin/base_site.html" %} +{% load i18n %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block content %} +

    {% trans "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user." %}

    +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/admin/login.html b/venv/Lib/site-packages/simpleui/templates/admin/login.html new file mode 100644 index 0000000..24910df --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/login.html @@ -0,0 +1,133 @@ + +{% load i18n static simpletags %} +{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} + + + + + + + + {% block title %} + {{ site_title }}-{% trans 'Log in' %} + {% endblock %} + {% block icon %} +{# #} + {% endblock %} + + {% include 'admin/includes/css-part.html' %} + + {% block css %} + + {% endblock %} + {% block bg %} + + {% endblock %} + + {% block head %} + {# You can add code here. #} + {% endblock %} + + + +
    + {% block logo %} + + {% endblock %} + + {% block header %} +
    {{ site_header }}
    + {% endblock %} + + {% block errors %} + {% if form.non_field_errors %} + {% for error in form.non_field_errors %} + + + {% endfor %} + {% endif %} + {% if form.errors and not form.non_field_errors %} +

    + {% if form.errors.items|length == 1 %} + + {% else %} + + {% endif %} +

    + {% endif %} + {% endblock %} + {% block form %} +
    + {% csrf_token %} +
    + +
    +
    + +
    + + + +
    + {% endblock %} +
    + +{% include 'admin/includes/js-part.html' %} + + + +{% block particles %} + {% if 'SIMPLEUI_LOGIN_PARTICLES'|get_config != False %} + + + +
    + + + {% endif %} +{% endblock %} + + + \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/templates/admin/object_history.html b/venv/Lib/site-packages/simpleui/templates/admin/object_history.html new file mode 100644 index 0000000..7f9f4b1 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/object_history.html @@ -0,0 +1,50 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block content %} + +
    +
    + + {% if action_list %} + + + + + + + + + + {% for action in action_list %} + + + + + + {% endfor %} + +
    {% trans 'Date/time' %}{% trans 'User' %}{% trans 'Action' %}
    {{ action.action_time|date:"DATETIME_FORMAT" }}{{ action.user.get_username }}{% if action.user.get_full_name %} ( + {{ action.user.get_full_name }}){% endif %}{{ action.get_change_message }}
    + {% else %} +

    {% trans "This object doesn't have a change history. It probably wasn't added via this admin site." %}

    + {% endif %} +
    +
    + +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/admin/pagination.html b/venv/Lib/site-packages/simpleui/templates/admin/pagination.html new file mode 100644 index 0000000..9dedf8e --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/pagination.html @@ -0,0 +1,34 @@ +{% load admin_list %} +{% load i18n %} +{% load simpletags %} + + \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/templates/admin/popup_response.html b/venv/Lib/site-packages/simpleui/templates/admin/popup_response.html new file mode 100644 index 0000000..dd2e108 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/popup_response.html @@ -0,0 +1,12 @@ +{% load i18n static %} + + + {% trans 'Popup closing...' %} + + + + diff --git a/venv/Lib/site-packages/simpleui/templates/admin/prepopulated_fields_js.html b/venv/Lib/site-packages/simpleui/templates/admin/prepopulated_fields_js.html new file mode 100644 index 0000000..1572339 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/prepopulated_fields_js.html @@ -0,0 +1,6 @@ +{% load l10n static %} + diff --git a/venv/Lib/site-packages/simpleui/templates/admin/related_widget_wrapper.html b/venv/Lib/site-packages/simpleui/templates/admin/related_widget_wrapper.html new file mode 100644 index 0000000..af17be8 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/related_widget_wrapper.html @@ -0,0 +1,29 @@ +{% load i18n static %} + diff --git a/venv/Lib/site-packages/simpleui/templates/admin/search_form.html b/venv/Lib/site-packages/simpleui/templates/admin/search_form.html new file mode 100644 index 0000000..3a30654 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/search_form.html @@ -0,0 +1,245 @@ +{% load i18n static %} +{% load simpletags %} +{% if cl.search_fields or cl.has_filters %} + + {% autoescape off %} + {% load_dates %} + {% endautoescape %} + +
    + +
    + + +{% else %} + +{% endif %} diff --git a/venv/Lib/site-packages/simpleui/templates/admin/submit_line.html b/venv/Lib/site-packages/simpleui/templates/admin/submit_line.html new file mode 100644 index 0000000..4beb25a --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/admin/submit_line.html @@ -0,0 +1,53 @@ +{% load i18n admin_urls simpletags%} +
    + {% if '_popup' not in request.GET %} + + + + {% endif %} + {% if show_delete_link %} + {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %} + {% trans "Delete" %} + {% endif %} + {% if show_save_as_new %} + {% trans 'Save as new' %} + {% endif %} + {% if show_save_and_add_another %} + + {% endif %} + {% if show_save_and_continue %} + + + {% endif %} + {% if show_save %} + + {% endif %} + +
    + \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/templates/registration/logged_out.html b/venv/Lib/site-packages/simpleui/templates/registration/logged_out.html new file mode 100644 index 0000000..509de22 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/registration/logged_out.html @@ -0,0 +1,21 @@ +{#{% extends "admin/base_site.html" %}#} +{% load i18n %} +{##} +{#{% block breadcrumbs %}{% endblock %}#} +{##} +{#{% block content %}#} +{##} +{#

    {% trans "Thanks for spending some quality time with the Web site today." %}

    #} +{##} +{#

    {% trans 'Log in again' %}

    #} +{##} +{#{% endblock %}#} + + + + + + +

    {% trans 'Log in again' %}

    + + \ No newline at end of file diff --git a/venv/Lib/site-packages/simpleui/templates/registration/password_change_done.html b/venv/Lib/site-packages/simpleui/templates/registration/password_change_done.html new file mode 100644 index 0000000..e524eb4 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/registration/password_change_done.html @@ -0,0 +1,23 @@ +{% extends "admin/base_site.html" %} +{% load i18n %} +{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %} + {% trans 'Documentation' %} / {% endif %}{% trans 'Change password' %} / + {% trans 'Log out' %}{% endblock %} +{% block breadcrumbs %} + +{% endblock %} + +{% block title %}{{ title }}{% endblock %} +{% block content_title %}

    {{ title }}

    {% endblock %} +{% block content %} +

    {% trans 'Your password was changed.' %}

    + +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/registration/password_change_form.html b/venv/Lib/site-packages/simpleui/templates/registration/password_change_form.html new file mode 100644 index 0000000..8c0f974 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/registration/password_change_form.html @@ -0,0 +1,98 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} +{% block extrastyle %}{{ block.super }} + {% endblock %} +{% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %} + {% trans 'Documentation' %} / {% endif %} {% trans 'Change password' %} / + {% trans 'Log out' %}{% endblock %} +{% block breadcrumbs %} + +{% endblock %} + +{% block title %}{{ title }}{% endblock %} +{% block content %} + {% if request.GET.dialog == '1' %} + + {% endif %} +
    +
    + + + + {% if form.errors %} + {% if form.errors.items|length == 1 %} + + + {% else %} + + + {% endif %} + {% endif %} + + + + {% csrf_token %} + + + {{ form.old_password.errors }} + + + + + {{ form.new_password1.errors }} + {% if form.new_password1.help_text %} +
    {{ form.new_password1.help_text|safe }}
    + {% endif %} +
    + + + + {{ form.new_password2.errors }} + + + + {% trans 'Change my password' %} + + +
    + + +
    +
    + + +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/registration/password_reset_complete.html b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_complete.html new file mode 100644 index 0000000..19f87a5 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_complete.html @@ -0,0 +1,20 @@ +{% extends "admin/base_site.html" %} +{% load i18n %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block title %}{{ title }}{% endblock %} +{% block content_title %}

    {{ title }}

    {% endblock %} + +{% block content %} + +

    {% trans "Your password has been set. You may go ahead and log in now." %}

    + +

    {% trans 'Log in' %}

    + +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/registration/password_reset_confirm.html b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_confirm.html new file mode 100644 index 0000000..8666fa9 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_confirm.html @@ -0,0 +1,42 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% block extrastyle %}{{ block.super }}{% endblock %} +{% block breadcrumbs %} + +{% endblock %} + +{% block title %}{{ title }}{% endblock %} +{% block content_title %}

    {{ title }}

    {% endblock %} +{% block content %} + +{% if validlink %} + +

    {% trans "Please enter your new password twice so we can verify you typed it in correctly." %}

    + +
    {% csrf_token %} +
    +
    + {{ form.new_password1.errors }} + + {{ form.new_password1 }} +
    +
    + {{ form.new_password2.errors }} + + {{ form.new_password2 }} +
    + +
    +
    + +{% else %} + +

    {% trans "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}

    + +{% endif %} + +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/registration/password_reset_done.html b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_done.html new file mode 100644 index 0000000..c6fc358 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_done.html @@ -0,0 +1,19 @@ +{% extends "admin/base_site.html" %} +{% load i18n %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block title %}{{ title }}{% endblock %} +{% block content_title %}

    {{ title }}

    {% endblock %} +{% block content %} + +

    {% trans "We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly." %}

    + +

    {% trans "If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder." %}

    + +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templates/registration/password_reset_email.html b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_email.html new file mode 100644 index 0000000..01b3bcc --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_email.html @@ -0,0 +1,14 @@ +{% load i18n %}{% autoescape off %} +{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %} + +{% trans "Please go to the following page and choose a new password:" %} +{% block reset_link %} +{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} +{% endblock %} +{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }} + +{% trans "Thanks for using our site!" %} + +{% blocktrans %}The {{ site_name }} team{% endblocktrans %} + +{% endautoescape %} diff --git a/venv/Lib/site-packages/simpleui/templates/registration/password_reset_form.html b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_form.html new file mode 100644 index 0000000..5c5d761 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templates/registration/password_reset_form.html @@ -0,0 +1,29 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% block extrastyle %}{{ block.super }}{% endblock %} +{% block breadcrumbs %} + +{% endblock %} + +{% block title %}{{ title }}{% endblock %} +{% block content_title %}

    {{ title }}

    {% endblock %} +{% block content %} + +

    {% trans "Forgotten your password? Enter your email address below, and we'll email instructions for setting a new one." %}

    + +
    {% csrf_token %} +
    +
    + {{ form.email.errors }} + + {{ form.email }} +
    + +
    +
    + +{% endblock %} diff --git a/venv/Lib/site-packages/simpleui/templatetags/__init__.py b/venv/Lib/site-packages/simpleui/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/simpleui/templatetags/simpletags.py b/venv/Lib/site-packages/simpleui/templatetags/simpletags.py new file mode 100644 index 0000000..32bd39d --- /dev/null +++ b/venv/Lib/site-packages/simpleui/templatetags/simpletags.py @@ -0,0 +1,480 @@ +# -*- coding: utf-8 -*- + +import base64 +import json +import os +import platform +import sys +import time + +import django +import simpleui +from django import template + +from django.core.serializers.json import DjangoJSONEncoder +from django.db import models +from django.urls import reverse +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.utils.html import format_html +from django.utils.safestring import mark_safe + +register = template.Library() + +PY_VER = sys.version[0] # 2 or 3 +from django.utils.translation import gettext_lazy as _ + +if PY_VER != '2': + from importlib import reload + + +def unicode_to_str(u, encoding='utf-8'): + if PY_VER != '2': + return u + return u.encode(encoding) + + +class LazyEncoder(DjangoJSONEncoder): + """ + 解决json __proxy__ 问题 + """ + + def default(self, obj): + if isinstance(obj, Promise): + return force_text(obj) + return super(LazyEncoder, self).default(obj) + + +@register.simple_tag(takes_context=True) +def context_test(context): + print(context) + pass + + +# context.get('cl').filter_specs[1].links +@register.simple_tag(takes_context=True) +def load_dates(context): + data = {} + cl = context.get('cl') + if cl.has_filters: + for spec in cl.filter_specs: + # 自定义的filter,没有field + if not hasattr(spec, 'field'): + continue + + field = spec.field + field_type = None + if isinstance(field, models.DateTimeField): + field_type = 'datetime' + elif isinstance(field, models.DateField): + field_type = 'date' + elif isinstance(field, models.TimeField): + field_type = 'time' + + if field_type: + data[spec.field_path] = field_type + context['date_field'] = data + + return ''.format(json.dumps(data, cls=LazyEncoder)) + + +@register.filter +def has_filter(spec): + return hasattr(spec, 'parameter_name') + + +@register.filter +def get_date_type(spec): + field = spec.field + field_type = '' + if isinstance(field, models.DateTimeField): + field_type = 'datetime' + elif isinstance(field, models.DateField): + field_type = 'date' + elif isinstance(field, models.TimeField): + field_type = 'time' + + return field_type + + +@register.filter +def test(obj): + print(obj) + # pass + return '' + + +@register.filter +def to_str(obj): + return str(obj) + + +@register.filter +def date_to_json(obj): + return json.dumps(obj.date_params, cls=LazyEncoder) + + +@register.simple_tag(takes_context=True) +def home_page(context): + ''' + 处理首页,通过设置判断打开的是默认页还是自定义的页面 + :return: + ''' + home = __get_config('SIMPLEUI_HOME_PAGE') + if home: + context['home'] = home + + title = __get_config('SIMPLEUI_HOME_TITLE') + if not title: + title = '首页' + + icon = __get_config('SIMPLEUI_HOME_ICON') + if not icon: + icon = 'el-icon-menu' + + context['title'] = title + context['icon'] = icon + + return '' + + +def __get_config(name): + from django.conf import settings + value = os.environ.get(name, getattr(settings, name, None)) + + return value + + +@register.filter +def get_config(key): + return __get_config(key) + + +@register.simple_tag +def get_version(): + return simpleui.get_version() + + +@register.simple_tag +def get_app_info(): + return format_table({"version": simpleui.get_version()}) + + +def format_table(d): + html = '' + for key in d: + html += ''.format(key, d.get(key)) + html += '
    {}{}
    ' + return format_html(html) + + +@register.simple_tag(takes_context=True) +def menus(context, _get_config=None): + data = [] + + # return request.user.has_perm("%s.%s" % (opts.app_label, codename)) + if not _get_config: + _get_config = get_config + + config = _get_config('SIMPLEUI_CONFIG') + if not config: + config = {} + + if config.get('dynamic', False) is True: + config = _import_reload(_get_config('DJANGO_SETTINGS_MODULE')).SIMPLEUI_CONFIG + + app_list = context.get('app_list') + for app in app_list: + _models = [ + { + 'name': m.get('name'), + 'icon': get_icon(m.get('object_name'), unicode_to_str(m.get('name'))), + 'url': m.get('admin_url'), + 'addUrl': m.get('add_url'), + 'breadcrumbs': [{ + 'name': app.get('name'), + 'icon': get_icon(app.get('app_label'), app.get('name')) + }, { + 'name': m.get('name'), + 'icon': get_icon(m.get('object_name'), unicode_to_str(m.get('name'))) + }] + } + + for m in app.get('models') + ] if app.get('models') else [] + + module = { + 'name': app.get('name'), + 'icon': get_icon(app.get('app_label'), app.get('name')), + 'models': _models + } + data.append(module) + + # 如果有menu 就读取,没有就调用系统的 + key = 'system_keep' + if config and 'menus' in config: + if config.get(key, None): + temp = config.get('menus') + for i in temp: + # 处理面包屑 + if 'models' in i: + for k in i.get('models'): + k['breadcrumbs'] = [{ + 'name': i.get('name'), + 'icon': i.get('icon') + }, { + 'name': k.get('name'), + 'icon': k.get('icon') + }] + else: + i['breadcrumbs'] = [{ + 'name': i.get('name'), + 'icon': i.get('icon') + }] + data.append(i) + else: + data = config.get('menus') + + # 获取侧边栏排序, 如果设置了就按照设置的内容排序, 留空则表示默认排序以及全部显示 + if config.get('menu_display') is not None: + display_data = list() + for _app in data: + if _app['name'] not in config.get('menu_display'): + continue + _app['_weight'] = config.get('menu_display').index(_app['name']) + display_data.append(_app) + display_data.sort(key=lambda x: x['_weight']) + data = display_data + + # 给每个菜单增加一个唯一标识,用于tab页判断 + eid = 1000 + for i in data: + eid += 1 + i['eid'] = eid + if 'models' in i: + for k in i.get('models'): + eid += 1 + k['eid'] = eid + + return ''.format(json.dumps(data, cls=LazyEncoder)) + + +def get_icon(obj, name=None): + temp = get_config_icon(name) + if temp != '': + return temp + + _dict = { + 'auth': 'fas fa-shield-alt', + 'User': 'far fa-user', + 'Group': 'fas fa-users-cog' + } + temp = _dict.get(obj) + if not temp: + _default = __get_config('SIMPLEUI_DEFAULT_ICON') + if _default is None or _default: + return 'far fa-file' + return '' + return temp + + +# 从配置中读取图标 +def get_config_icon(name): + _config_icon = __get_config('SIMPLEUI_ICON') + if _config_icon is None: + return '' + + if name in _config_icon: + return _config_icon.get(name) + return '' + + +@register.simple_tag(takes_context=True) +def load_message(context): + messages = context.get('messages') + array = [dict(msg=msg.message, tag=msg.tags) for msg in messages] if messages else [] + + return ''.format( + json.dumps(array, cls=LazyEncoder)) + + +@register.simple_tag(takes_context=True) +def context_to_json(context): + json_str = '{}' + + return mark_safe(json_str) + + +@register.simple_tag() +def get_language(): + from django.conf import settings + return settings.LANGUAGE_CODE.lower() + + +@register.filter +def get_language_code(val): + from django.conf import settings + return settings.LANGUAGE_CODE.lower() + + +def get_analysis_config(): + val = __get_config('SIMPLEUI_ANALYSIS') + if val: + return True + return False + + +@register.simple_tag(takes_context=True) +def load_analysis(context): + try: + if not get_analysis_config(): + return '' + + # 理论上值一天只上报一次 + key = 'simpleui_' + time.strftime('%Y%m%d', time.localtime()) + + if key in context.request.session: + return '' + + b64 = "" + j = { + "n": platform.node(), + "o": platform.platform(), + "p": platform.python_version(), + "d": django.get_version(), + "s": simpleui.get_version(), + } + if 'theme_name' in context.request.COOKIES: + j['t'] = context.request.COOKIES['theme_name'] + else: + j['t'] = 'Default' + + b64 = base64.b64encode(str(j).encode('utf-8')) + + url = '//simpleui.88cto.com/analysis' + b64 = b64.decode('utf-8') + html = ''.format(url, b64); + context.request.session[key] = True + + return mark_safe(html) + except: + return '' + + +@register.simple_tag(takes_context=True) +def custom_button(context): + admin = context.get('cl').model_admin + data = {} + actions = admin.get_actions(context.request) + # if hasattr(admin, 'actions'): + # actions = admin.actions + # 输出自定义按钮的属性 + + if actions: + i = 0 + for name in actions: + values = {} + fun = actions.get(name)[0] + for key, v in fun.__dict__.items(): + if key != '__len__' and key != '__wrapped__': + values[key] = v + values['eid'] = i + i += 1 + data[name] = values + + return json.dumps(data, cls=LazyEncoder) + + +from django.db.models.fields.related import ForeignKey + + +def get_model_fields(model, base=None): + field_list = [] + fields = model._meta.fields + for f in fields: + label = f.name + if hasattr(f, 'verbose_name'): + label = getattr(f, 'verbose_name') + + if isinstance(label, Promise): + label = str(label) + + if base: + field_list.append(('{}__{}'.format(base, f.name), label)) + else: + field_list.append((f.name, label)) + + return field_list + + +@register.simple_tag(takes_context=True) +def search_placeholder(context): + cl = context.get('cl') + + # 取消递归,只获取2级 + fields = get_model_fields(cl.model) + + for f in cl.model._meta.fields: + if isinstance(f, ForeignKey): + fields.extend(get_model_fields(f.related_model, f.name)) + + verboses = [] + + for s in cl.search_fields: + for f in fields: + if f[0] == s: + verboses.append(f[1]) + break + + return ",".join(verboses) + + +def _import_reload(_modules): + _obj = __import__(_modules, fromlist=_modules.split('.')) + reload(_obj) + return _obj + + +@register.simple_tag +def get_tz_suffix(): + # 判断settings.py中的TZ是否为false + tz = __get_config('USE_TZ') + # 必须明确指定为True的时候,才返回+8 的后缀 + if tz: + return '+08:00' + return '' + + +@register.simple_tag +def simple_version(): + return simpleui.get_version() + + +@register.simple_tag(takes_context=True) +def get_model_url(context): + # reverse() + opts = context.get('opts') + key = 'admin:{}_{}_changelist'.format(opts.app_label, opts.model_name) + return reverse(key) + + +@register.simple_tag +def has_enable_admindoc(): + from django.conf import settings + apps = settings.INSTALLED_APPS + return 'django.contrib.admindocs' in apps + + +@register.simple_tag(takes_context=True) +def has_admindoc_page(context): + if hasattr(context, 'template_name'): + return context.template_name.find('admin_doc') == 0 + return False + + +@register.simple_tag +def get_boolean_choices(): + return ( + ('True', _('Yes')), + ('False', _('No')) + ) diff --git a/venv/Lib/site-packages/simpleui/widgets.py b/venv/Lib/site-packages/simpleui/widgets.py new file mode 100644 index 0000000..5b92247 --- /dev/null +++ b/venv/Lib/site-packages/simpleui/widgets.py @@ -0,0 +1,286 @@ +# -*- encoding: utf-8 -*- +""" +@File : widgets.py +@Time : 2020/1/3 11:22 +@Author : chise +@Email : chise123@live.com +@Software: PyCharm +@info :小部件 +""" +import typing +import copy +import datetime +import re +import warnings +from collections import defaultdict +from itertools import chain + +from django.conf import settings +from django.forms.renderers import get_default_renderer +from django.forms.utils import to_current_timezone +from django.forms.widgets import media_property +from django.templatetags.static import static +from django.utils import datetime_safe, formats +from django.utils.datastructures import OrderedSet +from django.utils.dates import MONTHS +from django.utils.formats import get_format +from django.utils.html import format_html, html_safe +from django.utils.safestring import mark_safe +from django.utils.topological_sort import ( + CyclicDependencyError, stable_topological_sort, +) +from django.utils.translation import gettext_lazy as _ + +__all__ = ('STextInput', 'SPasswordInput', + 'SURLInput', 'SEmailInput', 'SNumberInput',) + + +class MediaDefiningClass(type): + """ + 元类:媒体定义。 + """ + + def __new__(mcs, name, bases, attrs): + new_class = super(MediaDefiningClass, mcs).__new__(mcs, name, bases, attrs) + + if 'media' not in attrs: + new_class.media = media_property(new_class) + + return new_class + + +class CWidget(metaclass=MediaDefiningClass): + needs_multipart_form = False # 确定此小部件是否需要多部件表单 + is_localized = False + is_required = False + supports_microseconds = True + bind_attr={} + def __init__(self, attrs=None): + self.attrs = {} if attrs is None else attrs.copy() + + def __deepcopy__(self, memo): + obj = copy.copy(self) + obj.attrs = self.attrs.copy() + memo[id(self)] = obj + return obj + + @property + def is_hidden(self): + return self.input_type == 'hidden' if hasattr(self, 'input_type') else False + + def subwidgets(self, name, value, attrs=None): + context = self.get_context(name, value, attrs) + yield context['widget'] + + def format_value(self, value): + """ + 返回在模板中呈现时应该出现的值。 + """ + if value == '' or value is None: + return None + if self.is_localized: + return formats.localize_input(value) + return str(value) + + def get_context(self, name, value, attrs): + context = {} + context['widget'] = { + 'name': name, + 'is_hidden': self.is_hidden, + 'required': self.is_required, + 'value': self.format_value(value), + 'attrs': self.build_attrs(self.attrs, attrs), + 'template_name': self.template_name, + } + return context + + def render(self, name, value, attrs=None, renderer=None): + """将小部件呈现为HTML字符串。""" + context = self.get_context(name, value, attrs) + return self._render(self.template_name, context, renderer) + + def _render(self, template_name, context, renderer=None): + if renderer is None: + renderer = get_default_renderer() + return mark_safe(renderer.render(template_name, context)) + + def build_attrs(self, base_attrs, extra_attrs=None): + """Build an attribute dictionary.""" + return {**base_attrs, **(extra_attrs or {})} + + def value_from_datadict(self, data, files, name): + """ + Given a dictionary of data and this widget's name, return the value + of this widget or None if it's not provided. + """ + return data.get(name) + + def value_omitted_from_data(self, data, files, name): + return name not in data + + def id_for_label(self, id_): + """ + 给定字段的ID,返回此小部件的HTML ID属性,以供