├── .DS_Store ├── blogpost ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-39.pyc │ ├── settings.cpython-39.pyc │ ├── urls.cpython-39.pyc │ └── wsgi.cpython-39.pyc ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── db.sqlite3 ├── food01.jpeg ├── food2.jpeg ├── images ├── IMG-0847.jpeg ├── background.jpeg ├── food1.jpeg ├── food2.jpeg ├── food3.jpeg ├── food4.jpeg ├── learn1.jpeg ├── learn2.png ├── learn3.jpeg ├── learn4.jpeg ├── review1.jpeg ├── review2.png ├── review3.jpeg └── review4.jpeg ├── learn01.jpeg ├── manage.py ├── media_cdn ├── IMG-0847.jpeg ├── food01.jpeg ├── food1.jpeg ├── food1_Ncrxltm.jpeg ├── food2.jpeg ├── food2_0F0JWVs.jpeg ├── food2_qacEbiW.jpeg ├── food3.jpeg ├── food4.jpeg ├── learn01.jpeg ├── learn1.jpeg ├── learn2.png ├── learn3.jpeg ├── learn4.jpeg ├── review01.jpeg ├── review1.jpeg ├── review2.png ├── review3.jpeg └── review4.jpeg ├── posts ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-39.pyc │ ├── admin.cpython-39.pyc │ ├── apps.cpython-39.pyc │ ├── models.cpython-39.pyc │ └── views.cpython-39.pyc ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_category_slug.py │ ├── 0003_post_slug.py │ ├── 0004_category_subtitle.py │ ├── 0005_post_content.py │ ├── 0006_author_profile_picture_post_thumbnail.py │ ├── 0007_category_thumbnail.py │ ├── __init__.py │ └── __pycache__ │ │ ├── 0001_initial.cpython-39.pyc │ │ ├── 0002_category_slug.cpython-39.pyc │ │ ├── 0003_post_slug.cpython-39.pyc │ │ ├── 0004_category_subtitle.cpython-39.pyc │ │ ├── 0005_post_content.cpython-39.pyc │ │ ├── 0006_author_profile_picture_post_thumbnail.cpython-39.pyc │ │ ├── 0007_category_thumbnail.cpython-39.pyc │ │ └── __init__.cpython-39.pyc ├── models.py ├── templatetags │ ├── __pycache__ │ │ └── markdown_extras.cpython-39.pyc │ └── markdown_extras.py ├── tests.py └── views.py ├── readme.md ├── requirements.txt ├── review01.jpeg ├── static_cdn └── admin │ ├── css │ ├── autocomplete.css │ ├── base.css │ ├── changelists.css │ ├── dashboard.css │ ├── fonts.css │ ├── forms.css │ ├── login.css │ ├── nav_sidebar.css │ ├── responsive.css │ ├── responsive_rtl.css │ ├── rtl.css │ ├── vendor │ │ └── select2 │ │ │ ├── LICENSE-SELECT2.md │ │ │ ├── select2.css │ │ │ └── select2.min.css │ └── widgets.css │ ├── fonts │ ├── LICENSE.txt │ ├── README.txt │ ├── Roboto-Bold-webfont.woff │ ├── Roboto-Light-webfont.woff │ └── Roboto-Regular-webfont.woff │ ├── img │ ├── LICENSE │ ├── README.txt │ ├── calendar-icons.svg │ ├── gis │ │ ├── move_vertex_off.svg │ │ └── move_vertex_on.svg │ ├── icon-addlink.svg │ ├── icon-alert.svg │ ├── icon-calendar.svg │ ├── icon-changelink.svg │ ├── icon-clock.svg │ ├── icon-deletelink.svg │ ├── icon-no.svg │ ├── icon-unknown-alt.svg │ ├── icon-unknown.svg │ ├── icon-viewlink.svg │ ├── icon-yes.svg │ ├── inline-delete.svg │ ├── search.svg │ ├── selector-icons.svg │ ├── sorting-icons.svg │ ├── tooltag-add.svg │ └── tooltag-arrowright.svg │ └── js │ ├── SelectBox.js │ ├── SelectFilter2.js │ ├── actions.js │ ├── admin │ ├── DateTimeShortcuts.js │ └── RelatedObjectLookups.js │ ├── autocomplete.js │ ├── calendar.js │ ├── cancel.js │ ├── change_form.js │ ├── collapse.js │ ├── core.js │ ├── inlines.js │ ├── jquery.init.js │ ├── nav_sidebar.js │ ├── popup_response.js │ ├── prepopulate.js │ ├── prepopulate_init.js │ ├── urlify.js │ └── vendor │ ├── jquery │ ├── LICENSE.txt │ ├── jquery.js │ └── jquery.min.js │ ├── select2 │ ├── LICENSE.md │ ├── i18n │ │ ├── af.js │ │ ├── ar.js │ │ ├── az.js │ │ ├── bg.js │ │ ├── bn.js │ │ ├── bs.js │ │ ├── ca.js │ │ ├── cs.js │ │ ├── da.js │ │ ├── de.js │ │ ├── dsb.js │ │ ├── el.js │ │ ├── en.js │ │ ├── es.js │ │ ├── et.js │ │ ├── eu.js │ │ ├── fa.js │ │ ├── fi.js │ │ ├── fr.js │ │ ├── gl.js │ │ ├── he.js │ │ ├── hi.js │ │ ├── hr.js │ │ ├── hsb.js │ │ ├── hu.js │ │ ├── hy.js │ │ ├── id.js │ │ ├── is.js │ │ ├── it.js │ │ ├── ja.js │ │ ├── ka.js │ │ ├── km.js │ │ ├── ko.js │ │ ├── lt.js │ │ ├── lv.js │ │ ├── mk.js │ │ ├── ms.js │ │ ├── nb.js │ │ ├── ne.js │ │ ├── nl.js │ │ ├── pl.js │ │ ├── ps.js │ │ ├── pt-BR.js │ │ ├── pt.js │ │ ├── ro.js │ │ ├── ru.js │ │ ├── sk.js │ │ ├── sl.js │ │ ├── sq.js │ │ ├── sr-Cyrl.js │ │ ├── sr.js │ │ ├── sv.js │ │ ├── th.js │ │ ├── tk.js │ │ ├── tr.js │ │ ├── uk.js │ │ ├── vi.js │ │ ├── zh-CN.js │ │ └── zh-TW.js │ ├── select2.full.js │ └── select2.full.min.js │ └── xregexp │ ├── LICENSE.txt │ ├── xregexp.js │ └── xregexp.min.js └── templates ├── about_page.html ├── all_posts.html ├── base.html ├── footer.html ├── homepage.html ├── navbar.html ├── post.html ├── post_list.html └── search_bar.html /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/.DS_Store -------------------------------------------------------------------------------- /blogpost/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/blogpost/__init__.py -------------------------------------------------------------------------------- /blogpost/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/blogpost/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /blogpost/__pycache__/settings.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/blogpost/__pycache__/settings.cpython-39.pyc -------------------------------------------------------------------------------- /blogpost/__pycache__/urls.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/blogpost/__pycache__/urls.cpython-39.pyc -------------------------------------------------------------------------------- /blogpost/__pycache__/wsgi.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/blogpost/__pycache__/wsgi.cpython-39.pyc -------------------------------------------------------------------------------- /blogpost/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for blogpost project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blogpost.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /blogpost/settings.py: -------------------------------------------------------------------------------- 1 | from importlib.resources import path 2 | from pathlib import Path 3 | 4 | import os 5 | 6 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 7 | BASE_DIR = Path(__file__).resolve().parent.parent 8 | 9 | 10 | # Quick-start development settings - unsuitable for production 11 | # See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ 12 | 13 | # SECURITY WARNING: keep the secret key used in production secret! 14 | SECRET_KEY = 'django-insecure-h2c$s&1u$c1g(4nwq4&x8_%p@n1dp8agxno^5!r$4m!4so&6(e' 15 | 16 | # SECURITY WARNING: don't run with debug turned on in production! 17 | DEBUG = True 18 | 19 | ALLOWED_HOSTS = [] 20 | 21 | 22 | # Application definition 23 | 24 | INSTALLED_APPS = [ 25 | 'django.contrib.admin', 26 | 'django.contrib.auth', 27 | 'django.contrib.contenttypes', 28 | 'django.contrib.sessions', 29 | 'django.contrib.messages', 30 | 'django.contrib.staticfiles', 31 | 'posts' 32 | ] 33 | 34 | MIDDLEWARE = [ 35 | 'django.middleware.security.SecurityMiddleware', 36 | 'django.contrib.sessions.middleware.SessionMiddleware', 37 | 'django.middleware.common.CommonMiddleware', 38 | 'django.middleware.csrf.CsrfViewMiddleware', 39 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 40 | 'django.contrib.messages.middleware.MessageMiddleware', 41 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 42 | ] 43 | 44 | ROOT_URLCONF = 'blogpost.urls' 45 | 46 | TEMPLATES = [ 47 | { 48 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 49 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], 50 | 'APP_DIRS': True, 51 | 'OPTIONS': { 52 | 'context_processors': [ 53 | 'django.template.context_processors.debug', 54 | 'django.template.context_processors.request', 55 | 'django.contrib.auth.context_processors.auth', 56 | 'django.contrib.messages.context_processors.messages', 57 | ], 58 | }, 59 | }, 60 | ] 61 | 62 | WSGI_APPLICATION = 'blogpost.wsgi.application' 63 | 64 | 65 | # Database 66 | # https://docs.djangoproject.com/en/4.0/ref/settings/#databases 67 | 68 | DATABASES = { 69 | 'default': { 70 | 'ENGINE': 'django.db.backends.sqlite3', 71 | 'NAME': BASE_DIR / 'db.sqlite3', 72 | } 73 | } 74 | 75 | 76 | # Password validation 77 | # https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators 78 | 79 | AUTH_PASSWORD_VALIDATORS = [ 80 | { 81 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 82 | }, 83 | { 84 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 85 | }, 86 | { 87 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 88 | }, 89 | { 90 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 91 | }, 92 | ] 93 | 94 | 95 | # Internationalization 96 | # https://docs.djangoproject.com/en/4.0/topics/i18n/ 97 | 98 | LANGUAGE_CODE = 'en-us' 99 | 100 | TIME_ZONE = 'UTC' 101 | 102 | USE_I18N = True 103 | 104 | USE_TZ = True 105 | 106 | 107 | # Static files (CSS, JavaScript, Images) 108 | # https://docs.djangoproject.com/en/4.0/howto/static-files/ 109 | 110 | STATIC_URL = '/static/' 111 | STATICFILES_DIRS = [ 112 | BASE_DIR / "static", 113 | # '/var/www/static/', 114 | ] 115 | MEDIA_URL = '/media/' 116 | 117 | STATIC_ROOT = os.path.join(BASE_DIR, "static_cdn") 118 | MEDIA_ROOT = os.path.join(BASE_DIR, "media_cdn") 119 | 120 | # Default primary key field type 121 | # https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field 122 | 123 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 124 | -------------------------------------------------------------------------------- /blogpost/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.conf.urls.static import static 3 | from django.contrib import admin 4 | from django.urls import path 5 | 6 | from posts.views import homepage, post, about, search, postlist, allposts 7 | 8 | urlpatterns = [ 9 | path('admin/', admin.site.urls), 10 | path('', homepage, name = 'homepage'), 11 | path('post//', post, name = 'post'), 12 | path('about/', about,name = 'about' ), 13 | path('search/', search, name = 'search'), 14 | path('postlist//', postlist, name = 'postlist'), 15 | path('posts/', allposts, name = 'allposts'), 16 | 17 | ] 18 | 19 | if settings.DEBUG: 20 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 21 | urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 22 | -------------------------------------------------------------------------------- /blogpost/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for blogpost project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blogpost.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/db.sqlite3 -------------------------------------------------------------------------------- /food01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/food01.jpeg -------------------------------------------------------------------------------- /food2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/food2.jpeg -------------------------------------------------------------------------------- /images/IMG-0847.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/IMG-0847.jpeg -------------------------------------------------------------------------------- /images/background.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/background.jpeg -------------------------------------------------------------------------------- /images/food1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/food1.jpeg -------------------------------------------------------------------------------- /images/food2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/food2.jpeg -------------------------------------------------------------------------------- /images/food3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/food3.jpeg -------------------------------------------------------------------------------- /images/food4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/food4.jpeg -------------------------------------------------------------------------------- /images/learn1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/learn1.jpeg -------------------------------------------------------------------------------- /images/learn2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/learn2.png -------------------------------------------------------------------------------- /images/learn3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/learn3.jpeg -------------------------------------------------------------------------------- /images/learn4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/learn4.jpeg -------------------------------------------------------------------------------- /images/review1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/review1.jpeg -------------------------------------------------------------------------------- /images/review2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/review2.png -------------------------------------------------------------------------------- /images/review3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/review3.jpeg -------------------------------------------------------------------------------- /images/review4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/images/review4.jpeg -------------------------------------------------------------------------------- /learn01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/learn01.jpeg -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blogpost.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /media_cdn/IMG-0847.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/IMG-0847.jpeg -------------------------------------------------------------------------------- /media_cdn/food01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/food01.jpeg -------------------------------------------------------------------------------- /media_cdn/food1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/food1.jpeg -------------------------------------------------------------------------------- /media_cdn/food1_Ncrxltm.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/food1_Ncrxltm.jpeg -------------------------------------------------------------------------------- /media_cdn/food2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/food2.jpeg -------------------------------------------------------------------------------- /media_cdn/food2_0F0JWVs.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/food2_0F0JWVs.jpeg -------------------------------------------------------------------------------- /media_cdn/food2_qacEbiW.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/food2_qacEbiW.jpeg -------------------------------------------------------------------------------- /media_cdn/food3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/food3.jpeg -------------------------------------------------------------------------------- /media_cdn/food4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/food4.jpeg -------------------------------------------------------------------------------- /media_cdn/learn01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/learn01.jpeg -------------------------------------------------------------------------------- /media_cdn/learn1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/learn1.jpeg -------------------------------------------------------------------------------- /media_cdn/learn2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/learn2.png -------------------------------------------------------------------------------- /media_cdn/learn3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/learn3.jpeg -------------------------------------------------------------------------------- /media_cdn/learn4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/learn4.jpeg -------------------------------------------------------------------------------- /media_cdn/review01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/review01.jpeg -------------------------------------------------------------------------------- /media_cdn/review1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/review1.jpeg -------------------------------------------------------------------------------- /media_cdn/review2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/review2.png -------------------------------------------------------------------------------- /media_cdn/review3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/review3.jpeg -------------------------------------------------------------------------------- /media_cdn/review4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/media_cdn/review4.jpeg -------------------------------------------------------------------------------- /posts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/__init__.py -------------------------------------------------------------------------------- /posts/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /posts/__pycache__/admin.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/__pycache__/admin.cpython-39.pyc -------------------------------------------------------------------------------- /posts/__pycache__/apps.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/__pycache__/apps.cpython-39.pyc -------------------------------------------------------------------------------- /posts/__pycache__/models.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/__pycache__/models.cpython-39.pyc -------------------------------------------------------------------------------- /posts/__pycache__/views.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/__pycache__/views.cpython-39.pyc -------------------------------------------------------------------------------- /posts/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Author, Category, Post 4 | 5 | admin.site.register(Author) 6 | admin.site.register(Category) 7 | admin.site.register(Post) 8 | -------------------------------------------------------------------------------- /posts/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostsConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'posts' 7 | -------------------------------------------------------------------------------- /posts/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.2 on 2022-02-16 13:15 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Author', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 22 | ], 23 | ), 24 | migrations.CreateModel( 25 | name='Category', 26 | fields=[ 27 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 28 | ('title', models.CharField(max_length=20)), 29 | ], 30 | ), 31 | migrations.CreateModel( 32 | name='Post', 33 | fields=[ 34 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 35 | ('title', models.CharField(max_length=100)), 36 | ('overview', models.TextField()), 37 | ('timestamp', models.DateTimeField(auto_now_add=True)), 38 | ('featured', models.BooleanField()), 39 | ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='posts.author')), 40 | ('categories', models.ManyToManyField(to='posts.Category')), 41 | ], 42 | ), 43 | ] 44 | -------------------------------------------------------------------------------- /posts/migrations/0002_category_slug.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.2 on 2022-02-20 22:13 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='category', 15 | name='slug', 16 | field=models.SlugField(default='learn'), 17 | preserve_default=False, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /posts/migrations/0003_post_slug.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.2 on 2022-02-20 22:30 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0002_category_slug'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='post', 15 | name='slug', 16 | field=models.SlugField(default='something-123'), 17 | preserve_default=False, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /posts/migrations/0004_category_subtitle.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.2 on 2022-02-21 11:41 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0003_post_slug'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='category', 15 | name='subtitle', 16 | field=models.CharField(default='subtitle', max_length=20), 17 | preserve_default=False, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /posts/migrations/0005_post_content.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.2 on 2022-02-21 12:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0004_category_subtitle'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='post', 15 | name='content', 16 | field=models.TextField(default='content'), 17 | preserve_default=False, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /posts/migrations/0006_author_profile_picture_post_thumbnail.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.2 on 2022-02-21 17:12 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0005_post_content'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='author', 15 | name='profile_picture', 16 | field=models.ImageField(default='img', upload_to=''), 17 | preserve_default=False, 18 | ), 19 | migrations.AddField( 20 | model_name='post', 21 | name='thumbnail', 22 | field=models.ImageField(default='img', upload_to=''), 23 | preserve_default=False, 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /posts/migrations/0007_category_thumbnail.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.0.2 on 2022-02-21 17:14 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('posts', '0006_author_profile_picture_post_thumbnail'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='category', 15 | name='thumbnail', 16 | field=models.ImageField(default='img', upload_to=''), 17 | preserve_default=False, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /posts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/migrations/__init__.py -------------------------------------------------------------------------------- /posts/migrations/__pycache__/0001_initial.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/migrations/__pycache__/0001_initial.cpython-39.pyc -------------------------------------------------------------------------------- /posts/migrations/__pycache__/0002_category_slug.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/migrations/__pycache__/0002_category_slug.cpython-39.pyc -------------------------------------------------------------------------------- /posts/migrations/__pycache__/0003_post_slug.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/migrations/__pycache__/0003_post_slug.cpython-39.pyc -------------------------------------------------------------------------------- /posts/migrations/__pycache__/0004_category_subtitle.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/migrations/__pycache__/0004_category_subtitle.cpython-39.pyc -------------------------------------------------------------------------------- /posts/migrations/__pycache__/0005_post_content.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/migrations/__pycache__/0005_post_content.cpython-39.pyc -------------------------------------------------------------------------------- /posts/migrations/__pycache__/0006_author_profile_picture_post_thumbnail.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/migrations/__pycache__/0006_author_profile_picture_post_thumbnail.cpython-39.pyc -------------------------------------------------------------------------------- /posts/migrations/__pycache__/0007_category_thumbnail.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/migrations/__pycache__/0007_category_thumbnail.cpython-39.pyc -------------------------------------------------------------------------------- /posts/migrations/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/migrations/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /posts/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth import get_user_model 3 | 4 | User = get_user_model() 5 | 6 | class Author(models.Model): 7 | user = models.OneToOneField(User, on_delete=models.CASCADE) 8 | profile_picture = models.ImageField() 9 | 10 | def __str__(self): 11 | return self.user.username 12 | 13 | class Category(models.Model): 14 | title = models.CharField(max_length=20) 15 | subtitle = models.CharField(max_length=20) 16 | slug = models.SlugField() 17 | thumbnail = models.ImageField() 18 | 19 | def __str__(self): 20 | return self.title 21 | 22 | 23 | class Post(models.Model): 24 | title = models.CharField(max_length=100) 25 | slug = models.SlugField() 26 | overview = models.TextField() 27 | timestamp = models.DateTimeField(auto_now_add=True) 28 | content = models.TextField() 29 | author = models.ForeignKey(Author, on_delete=models.CASCADE) 30 | thumbnail = models.ImageField() 31 | categories = models.ManyToManyField(Category) 32 | featured = models.BooleanField() 33 | 34 | def __str__(self): 35 | return self.title 36 | 37 | 38 | -------------------------------------------------------------------------------- /posts/templatetags/__pycache__/markdown_extras.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/posts/templatetags/__pycache__/markdown_extras.cpython-39.pyc -------------------------------------------------------------------------------- /posts/templatetags/markdown_extras.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.template.defaultfilters import stringfilter 3 | from posts.models import Category 4 | import markdown as md 5 | 6 | register = template.Library() 7 | 8 | 9 | @register.filter() 10 | @stringfilter 11 | def markdown(value): 12 | return md.markdown(value, extensions=['markdown.extensions.fenced_code']) 13 | 14 | 15 | @register.simple_tag 16 | def get_categories(): 17 | return Category.objects.all()[0:3] -------------------------------------------------------------------------------- /posts/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /posts/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.db.models import Q 3 | from .models import Category, Post, Author 4 | 5 | def get_author(user): 6 | qs = Author.objects.filter(user=user) 7 | if qs.exists(): 8 | return qs[0] 9 | return None 10 | 11 | def homepage (request): 12 | categories = Category.objects.all()[0:3] 13 | featured = Post.objects.filter(featured=True) 14 | latest = Post.objects.order_by('-timestamp')[0:3] 15 | context= { 16 | 'object_list': featured, 17 | 'latest': latest, 18 | 'categories':categories, 19 | } 20 | return render(request, 'homepage.html',context) 21 | 22 | def post (request,slug): 23 | post = Post.objects.get(slug = slug) 24 | latest = Post.objects.order_by('-timestamp')[:3] 25 | context = { 26 | 'post': post, 27 | 'latest': latest, 28 | } 29 | return render(request, 'post.html', context) 30 | 31 | def about (request): 32 | return render(request, 'about_page.html') 33 | 34 | def search(request): 35 | queryset = Post.objects.all() 36 | query = request.GET.get('q') 37 | if query: 38 | queryset = queryset.filter( 39 | Q(title__icontains=query) | 40 | Q(overview__icontains=query) 41 | ).distinct() 42 | context = { 43 | 'object_list': queryset 44 | } 45 | return render(request, 'search_bar.html', context) 46 | 47 | 48 | def postlist (request,slug): 49 | category = Category.objects.get(slug = slug) 50 | posts = Post.objects.filter(categories__in=[category]) 51 | 52 | context = { 53 | 'posts': posts, 54 | 'category': category, 55 | } 56 | return render(request, 'post_list.html', context) 57 | 58 | def allposts(request): 59 | posts = Post.objects.order_by('-timestamp') 60 | 61 | context = { 62 | 'posts': posts, 63 | } 64 | return render(request, 'all_posts.html', context) 65 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | This prject is a basic blog built with Django, Tailwind CSS, ect with some features, eg; search bar, drop down menu and more. It's my first project, so go easy on me. I hope you like it. :) 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.5.0 2 | Django==4.0.2 3 | Markdown==3.2.1 4 | Pillow==9.0.1 5 | sqlparse==0.4.2 6 | -------------------------------------------------------------------------------- /review01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/review01.jpeg -------------------------------------------------------------------------------- /static_cdn/admin/css/changelists.css: -------------------------------------------------------------------------------- 1 | /* CHANGELISTS */ 2 | 3 | #changelist { 4 | display: flex; 5 | align-items: flex-start; 6 | justify-content: space-between; 7 | } 8 | 9 | #changelist .changelist-form-container { 10 | flex: 1 1 auto; 11 | min-width: 0; 12 | } 13 | 14 | #changelist table { 15 | width: 100%; 16 | } 17 | 18 | .change-list .hiddenfields { display:none; } 19 | 20 | .change-list .filtered table { 21 | border-right: none; 22 | } 23 | 24 | .change-list .filtered { 25 | min-height: 400px; 26 | } 27 | 28 | .change-list .filtered .results, .change-list .filtered .paginator, 29 | .filtered #toolbar, .filtered div.xfull { 30 | width: auto; 31 | } 32 | 33 | .change-list .filtered table tbody th { 34 | padding-right: 1em; 35 | } 36 | 37 | #changelist-form .results { 38 | overflow-x: auto; 39 | width: 100%; 40 | } 41 | 42 | #changelist .toplinks { 43 | border-bottom: 1px solid var(--hairline-color); 44 | } 45 | 46 | #changelist .paginator { 47 | color: var(--body-quiet-color); 48 | border-bottom: 1px solid var(--hairline-color); 49 | background: var(--body-bg); 50 | overflow: hidden; 51 | } 52 | 53 | /* CHANGELIST TABLES */ 54 | 55 | #changelist table thead th { 56 | padding: 0; 57 | white-space: nowrap; 58 | vertical-align: middle; 59 | } 60 | 61 | #changelist table thead th.action-checkbox-column { 62 | width: 1.5em; 63 | text-align: center; 64 | } 65 | 66 | #changelist table tbody td.action-checkbox { 67 | text-align: center; 68 | } 69 | 70 | #changelist table tfoot { 71 | color: var(--body-quiet-color); 72 | } 73 | 74 | /* TOOLBAR */ 75 | 76 | #toolbar { 77 | padding: 8px 10px; 78 | margin-bottom: 15px; 79 | border-top: 1px solid var(--hairline-color); 80 | border-bottom: 1px solid var(--hairline-color); 81 | background: var(--darkened-bg); 82 | color: var(--body-quiet-color); 83 | } 84 | 85 | #toolbar form input { 86 | border-radius: 4px; 87 | font-size: 14px; 88 | padding: 5px; 89 | color: var(--body-fg); 90 | } 91 | 92 | #toolbar #searchbar { 93 | height: 19px; 94 | border: 1px solid var(--border-color); 95 | padding: 2px 5px; 96 | margin: 0; 97 | vertical-align: top; 98 | font-size: 13px; 99 | max-width: 100%; 100 | } 101 | 102 | #toolbar #searchbar:focus { 103 | border-color: var(--body-quiet-color); 104 | } 105 | 106 | #toolbar form input[type="submit"] { 107 | border: 1px solid var(--border-color); 108 | font-size: 13px; 109 | padding: 4px 8px; 110 | margin: 0; 111 | vertical-align: middle; 112 | background: var(--body-bg); 113 | box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; 114 | cursor: pointer; 115 | color: var(--body-fg); 116 | } 117 | 118 | #toolbar form input[type="submit"]:focus, 119 | #toolbar form input[type="submit"]:hover { 120 | border-color: var(--body-quiet-color); 121 | } 122 | 123 | #changelist-search img { 124 | vertical-align: middle; 125 | margin-right: 4px; 126 | } 127 | 128 | #changelist-search .help { 129 | word-break: break-word; 130 | } 131 | 132 | /* FILTER COLUMN */ 133 | 134 | #changelist-filter { 135 | flex: 0 0 240px; 136 | order: 1; 137 | background: var(--darkened-bg); 138 | border-left: none; 139 | margin: 0 0 0 30px; 140 | } 141 | 142 | #changelist-filter h2 { 143 | font-size: 14px; 144 | text-transform: uppercase; 145 | letter-spacing: 0.5px; 146 | padding: 5px 15px; 147 | margin-bottom: 12px; 148 | border-bottom: none; 149 | } 150 | 151 | #changelist-filter h3 { 152 | font-weight: 400; 153 | padding: 0 15px; 154 | margin-bottom: 10px; 155 | } 156 | 157 | #changelist-filter ul { 158 | margin: 5px 0; 159 | padding: 0 15px 15px; 160 | border-bottom: 1px solid var(--hairline-color); 161 | } 162 | 163 | #changelist-filter ul:last-child { 164 | border-bottom: none; 165 | } 166 | 167 | #changelist-filter li { 168 | list-style-type: none; 169 | margin-left: 0; 170 | padding-left: 0; 171 | } 172 | 173 | #changelist-filter a { 174 | display: block; 175 | color: var(--body-quiet-color); 176 | text-overflow: ellipsis; 177 | overflow-x: hidden; 178 | } 179 | 180 | #changelist-filter li.selected { 181 | border-left: 5px solid var(--hairline-color); 182 | padding-left: 10px; 183 | margin-left: -15px; 184 | } 185 | 186 | #changelist-filter li.selected a { 187 | color: var(--link-selected-fg); 188 | } 189 | 190 | #changelist-filter a:focus, #changelist-filter a:hover, 191 | #changelist-filter li.selected a:focus, 192 | #changelist-filter li.selected a:hover { 193 | color: var(--link-hover-color); 194 | } 195 | 196 | #changelist-filter #changelist-filter-clear a { 197 | font-size: 13px; 198 | padding-bottom: 10px; 199 | border-bottom: 1px solid var(--hairline-color); 200 | } 201 | 202 | /* DATE DRILLDOWN */ 203 | 204 | .change-list ul.toplinks { 205 | display: block; 206 | float: left; 207 | padding: 0; 208 | margin: 0; 209 | width: 100%; 210 | } 211 | 212 | .change-list ul.toplinks li { 213 | padding: 3px 6px; 214 | font-weight: bold; 215 | list-style-type: none; 216 | display: inline-block; 217 | } 218 | 219 | .change-list ul.toplinks .date-back a { 220 | color: var(--body-quiet-color); 221 | } 222 | 223 | .change-list ul.toplinks .date-back a:focus, 224 | .change-list ul.toplinks .date-back a:hover { 225 | color: var(--link-hover-color); 226 | } 227 | 228 | /* PAGINATOR */ 229 | 230 | .paginator { 231 | font-size: 13px; 232 | padding-top: 10px; 233 | padding-bottom: 10px; 234 | line-height: 22px; 235 | margin: 0; 236 | border-top: 1px solid var(--hairline-color); 237 | width: 100%; 238 | } 239 | 240 | .paginator a:link, .paginator a:visited { 241 | padding: 2px 6px; 242 | background: var(--button-bg); 243 | text-decoration: none; 244 | color: var(--button-fg); 245 | } 246 | 247 | .paginator a.showall { 248 | border: none; 249 | background: none; 250 | color: var(--link-fg); 251 | } 252 | 253 | .paginator a.showall:focus, .paginator a.showall:hover { 254 | background: none; 255 | color: var(--link-hover-color); 256 | } 257 | 258 | .paginator .end { 259 | margin-right: 6px; 260 | } 261 | 262 | .paginator .this-page { 263 | padding: 2px 6px; 264 | font-weight: bold; 265 | font-size: 13px; 266 | vertical-align: top; 267 | } 268 | 269 | .paginator a:focus, .paginator a:hover { 270 | color: white; 271 | background: var(--link-hover-color); 272 | } 273 | 274 | /* ACTIONS */ 275 | 276 | .filtered .actions { 277 | border-right: none; 278 | } 279 | 280 | #changelist table input { 281 | margin: 0; 282 | vertical-align: baseline; 283 | } 284 | 285 | #changelist table tbody tr.selected { 286 | background-color: var(--selected-row); 287 | } 288 | 289 | #changelist .actions { 290 | padding: 10px; 291 | background: var(--body-bg); 292 | border-top: none; 293 | border-bottom: none; 294 | line-height: 24px; 295 | color: var(--body-quiet-color); 296 | width: 100%; 297 | } 298 | 299 | #changelist .actions.selected { /* XXX Probably unused? */ 300 | background: var(--body-bg); 301 | border-top: 1px solid var(--body-bg); 302 | border-bottom: 1px solid #edecd6; 303 | } 304 | 305 | #changelist .actions span.all, 306 | #changelist .actions span.action-counter, 307 | #changelist .actions span.clear, 308 | #changelist .actions span.question { 309 | font-size: 13px; 310 | margin: 0 0.5em; 311 | } 312 | 313 | #changelist .actions:last-child { 314 | border-bottom: none; 315 | } 316 | 317 | #changelist .actions select { 318 | vertical-align: top; 319 | height: 24px; 320 | color: var(--body-fg); 321 | border: 1px solid var(--border-color); 322 | border-radius: 4px; 323 | font-size: 14px; 324 | padding: 0 0 0 4px; 325 | margin: 0; 326 | margin-left: 10px; 327 | } 328 | 329 | #changelist .actions select:focus { 330 | border-color: var(--body-quiet-color); 331 | } 332 | 333 | #changelist .actions label { 334 | display: inline-block; 335 | vertical-align: middle; 336 | font-size: 13px; 337 | } 338 | 339 | #changelist .actions .button { 340 | font-size: 13px; 341 | border: 1px solid var(--border-color); 342 | border-radius: 4px; 343 | background: var(--body-bg); 344 | box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; 345 | cursor: pointer; 346 | height: 24px; 347 | line-height: 1; 348 | padding: 4px 8px; 349 | margin: 0; 350 | color: var(--body-fg); 351 | } 352 | 353 | #changelist .actions .button:focus, #changelist .actions .button:hover { 354 | border-color: var(--body-quiet-color); 355 | } 356 | -------------------------------------------------------------------------------- /static_cdn/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* DASHBOARD */ 2 | 3 | .dashboard .module table th { 4 | width: 100%; 5 | } 6 | 7 | .dashboard .module table td { 8 | white-space: nowrap; 9 | } 10 | 11 | .dashboard .module table td a { 12 | display: block; 13 | padding-right: .6em; 14 | } 15 | 16 | /* RECENT ACTIONS MODULE */ 17 | 18 | .module ul.actionlist { 19 | margin-left: 0; 20 | } 21 | 22 | ul.actionlist li { 23 | list-style-type: none; 24 | overflow: hidden; 25 | text-overflow: ellipsis; 26 | } 27 | -------------------------------------------------------------------------------- /static_cdn/admin/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Roboto'; 3 | src: url('../fonts/Roboto-Bold-webfont.woff'); 4 | font-weight: 700; 5 | font-style: normal; 6 | } 7 | 8 | @font-face { 9 | font-family: 'Roboto'; 10 | src: url('../fonts/Roboto-Regular-webfont.woff'); 11 | font-weight: 400; 12 | font-style: normal; 13 | } 14 | 15 | @font-face { 16 | font-family: 'Roboto'; 17 | src: url('../fonts/Roboto-Light-webfont.woff'); 18 | font-weight: 300; 19 | font-style: normal; 20 | } 21 | -------------------------------------------------------------------------------- /static_cdn/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | .login { 4 | background: var(--darkened-bg); 5 | height: auto; 6 | } 7 | 8 | .login #header { 9 | height: auto; 10 | padding: 15px 16px; 11 | justify-content: center; 12 | } 13 | 14 | .login #header h1 { 15 | font-size: 18px; 16 | margin: 0; 17 | } 18 | 19 | .login #header h1 a { 20 | color: var(--header-link-color); 21 | } 22 | 23 | .login #content { 24 | padding: 20px 20px 0; 25 | } 26 | 27 | .login #container { 28 | background: var(--body-bg); 29 | border: 1px solid var(--hairline-color); 30 | border-radius: 4px; 31 | overflow: hidden; 32 | width: 28em; 33 | min-width: 300px; 34 | margin: 100px auto; 35 | height: auto; 36 | } 37 | 38 | .login .form-row { 39 | padding: 4px 0; 40 | } 41 | 42 | .login .form-row label { 43 | display: block; 44 | line-height: 2em; 45 | } 46 | 47 | .login .form-row #id_username, .login .form-row #id_password { 48 | padding: 8px; 49 | width: 100%; 50 | box-sizing: border-box; 51 | } 52 | 53 | .login .submit-row { 54 | padding: 1em 0 0 0; 55 | margin: 0; 56 | text-align: center; 57 | } 58 | 59 | .login .password-reset-link { 60 | text-align: center; 61 | } 62 | -------------------------------------------------------------------------------- /static_cdn/admin/css/nav_sidebar.css: -------------------------------------------------------------------------------- 1 | .sticky { 2 | position: sticky; 3 | top: 0; 4 | max-height: 100vh; 5 | } 6 | 7 | .toggle-nav-sidebar { 8 | z-index: 20; 9 | left: 0; 10 | display: flex; 11 | align-items: center; 12 | justify-content: center; 13 | flex: 0 0 23px; 14 | width: 23px; 15 | border: 0; 16 | border-right: 1px solid var(--hairline-color); 17 | background-color: var(--body-bg); 18 | cursor: pointer; 19 | font-size: 20px; 20 | color: var(--link-fg); 21 | padding: 0; 22 | } 23 | 24 | [dir="rtl"] .toggle-nav-sidebar { 25 | border-left: 1px solid var(--hairline-color); 26 | border-right: 0; 27 | } 28 | 29 | .toggle-nav-sidebar:hover, 30 | .toggle-nav-sidebar:focus { 31 | background-color: var(--darkened-bg); 32 | } 33 | 34 | #nav-sidebar { 35 | z-index: 15; 36 | flex: 0 0 275px; 37 | left: -276px; 38 | margin-left: -276px; 39 | border-top: 1px solid transparent; 40 | border-right: 1px solid var(--hairline-color); 41 | background-color: var(--body-bg); 42 | overflow: auto; 43 | } 44 | 45 | [dir="rtl"] #nav-sidebar { 46 | border-left: 1px solid var(--hairline-color); 47 | border-right: 0; 48 | left: 0; 49 | margin-left: 0; 50 | right: -276px; 51 | margin-right: -276px; 52 | } 53 | 54 | .toggle-nav-sidebar::before { 55 | content: '\00BB'; 56 | } 57 | 58 | .main.shifted .toggle-nav-sidebar::before { 59 | content: '\00AB'; 60 | } 61 | 62 | .main.shifted > #nav-sidebar { 63 | margin-left: 0; 64 | } 65 | 66 | [dir="rtl"] .main.shifted > #nav-sidebar { 67 | margin-right: 0; 68 | } 69 | 70 | #nav-sidebar .module th { 71 | width: 100%; 72 | overflow-wrap: anywhere; 73 | } 74 | 75 | #nav-sidebar .module th, 76 | #nav-sidebar .module caption { 77 | padding-left: 16px; 78 | } 79 | 80 | #nav-sidebar .module td { 81 | white-space: nowrap; 82 | } 83 | 84 | [dir="rtl"] #nav-sidebar .module th, 85 | [dir="rtl"] #nav-sidebar .module caption { 86 | padding-left: 8px; 87 | padding-right: 16px; 88 | } 89 | 90 | #nav-sidebar .current-app .section:link, 91 | #nav-sidebar .current-app .section:visited { 92 | color: var(--header-color); 93 | font-weight: bold; 94 | } 95 | 96 | #nav-sidebar .current-model { 97 | background: var(--selected-row); 98 | } 99 | 100 | .main > #nav-sidebar + .content { 101 | max-width: calc(100% - 23px); 102 | } 103 | 104 | .main.shifted > #nav-sidebar + .content { 105 | max-width: calc(100% - 299px); 106 | } 107 | 108 | @media (max-width: 767px) { 109 | #nav-sidebar, #toggle-nav-sidebar { 110 | display: none; 111 | } 112 | 113 | .main > #nav-sidebar + .content, 114 | .main.shifted > #nav-sidebar + .content { 115 | max-width: 100%; 116 | } 117 | } 118 | 119 | #nav-filter { 120 | width: 100%; 121 | box-sizing: border-box; 122 | padding: 2px 5px; 123 | margin: 5px 0; 124 | border: 1px solid var(--border-color); 125 | background-color: var(--darkened-bg); 126 | color: var(--body-fg); 127 | } 128 | 129 | #nav-filter:focus { 130 | border-color: var(--body-quiet-color); 131 | } 132 | 133 | #nav-filter.no-results { 134 | background: var(--message-error-bg); 135 | } 136 | 137 | #nav-sidebar table { 138 | width: 100%; 139 | } 140 | -------------------------------------------------------------------------------- /static_cdn/admin/css/responsive_rtl.css: -------------------------------------------------------------------------------- 1 | /* TABLETS */ 2 | 3 | @media (max-width: 1024px) { 4 | [dir="rtl"] .colMS { 5 | margin-right: 0; 6 | } 7 | 8 | [dir="rtl"] #user-tools { 9 | text-align: right; 10 | } 11 | 12 | [dir="rtl"] #changelist .actions label { 13 | padding-left: 10px; 14 | padding-right: 0; 15 | } 16 | 17 | [dir="rtl"] #changelist .actions select { 18 | margin-left: 0; 19 | margin-right: 15px; 20 | } 21 | 22 | [dir="rtl"] .change-list .filtered .results, 23 | [dir="rtl"] .change-list .filtered .paginator, 24 | [dir="rtl"] .filtered #toolbar, 25 | [dir="rtl"] .filtered div.xfull, 26 | [dir="rtl"] .filtered .actions, 27 | [dir="rtl"] #changelist-filter { 28 | margin-left: 0; 29 | } 30 | 31 | [dir="rtl"] .inline-group ul.tools a.add, 32 | [dir="rtl"] .inline-group div.add-row a, 33 | [dir="rtl"] .inline-group .tabular tr.add-row td a { 34 | padding: 8px 26px 8px 10px; 35 | background-position: calc(100% - 8px) 9px; 36 | } 37 | 38 | [dir="rtl"] .related-widget-wrapper-link + .selector { 39 | margin-right: 0; 40 | margin-left: 15px; 41 | } 42 | 43 | [dir="rtl"] .selector .selector-filter label { 44 | margin-right: 0; 45 | margin-left: 8px; 46 | } 47 | 48 | [dir="rtl"] .object-tools li { 49 | float: right; 50 | } 51 | 52 | [dir="rtl"] .object-tools li + li { 53 | margin-left: 0; 54 | margin-right: 15px; 55 | } 56 | 57 | [dir="rtl"] .dashboard .module table td a { 58 | padding-left: 0; 59 | padding-right: 16px; 60 | } 61 | } 62 | 63 | /* MOBILE */ 64 | 65 | @media (max-width: 767px) { 66 | [dir="rtl"] .aligned .related-lookup, 67 | [dir="rtl"] .aligned .datetimeshortcuts { 68 | margin-left: 0; 69 | margin-right: 15px; 70 | } 71 | 72 | [dir="rtl"] .aligned ul { 73 | margin-right: 0; 74 | } 75 | 76 | [dir="rtl"] #changelist-filter { 77 | margin-left: 0; 78 | margin-right: 0; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /static_cdn/admin/css/rtl.css: -------------------------------------------------------------------------------- 1 | /* GLOBAL */ 2 | 3 | th { 4 | text-align: right; 5 | } 6 | 7 | .module h2, .module caption { 8 | text-align: right; 9 | } 10 | 11 | .module ul, .module ol { 12 | margin-left: 0; 13 | margin-right: 1.5em; 14 | } 15 | 16 | .viewlink, .addlink, .changelink { 17 | padding-left: 0; 18 | padding-right: 16px; 19 | background-position: 100% 1px; 20 | } 21 | 22 | .deletelink { 23 | padding-left: 0; 24 | padding-right: 16px; 25 | background-position: 100% 1px; 26 | } 27 | 28 | .object-tools { 29 | float: left; 30 | } 31 | 32 | thead th:first-child, 33 | tfoot td:first-child { 34 | border-left: none; 35 | } 36 | 37 | /* LAYOUT */ 38 | 39 | #user-tools { 40 | right: auto; 41 | left: 0; 42 | text-align: left; 43 | } 44 | 45 | div.breadcrumbs { 46 | text-align: right; 47 | } 48 | 49 | #content-main { 50 | float: right; 51 | } 52 | 53 | #content-related { 54 | float: left; 55 | margin-left: -300px; 56 | margin-right: auto; 57 | } 58 | 59 | .colMS { 60 | margin-left: 300px; 61 | margin-right: 0; 62 | } 63 | 64 | /* SORTABLE TABLES */ 65 | 66 | table thead th.sorted .sortoptions { 67 | float: left; 68 | } 69 | 70 | thead th.sorted .text { 71 | padding-right: 0; 72 | padding-left: 42px; 73 | } 74 | 75 | /* dashboard styles */ 76 | 77 | .dashboard .module table td a { 78 | padding-left: .6em; 79 | padding-right: 16px; 80 | } 81 | 82 | /* changelists styles */ 83 | 84 | .change-list .filtered table { 85 | border-left: none; 86 | border-right: 0px none; 87 | } 88 | 89 | #changelist-filter { 90 | border-left: none; 91 | border-right: none; 92 | margin-left: 0; 93 | margin-right: 30px; 94 | } 95 | 96 | #changelist-filter li.selected { 97 | border-left: none; 98 | padding-left: 10px; 99 | margin-left: 0; 100 | border-right: 5px solid var(--hairline-color); 101 | padding-right: 10px; 102 | margin-right: -15px; 103 | } 104 | 105 | #changelist table tbody td:first-child, #changelist table tbody th:first-child { 106 | border-right: none; 107 | border-left: none; 108 | } 109 | 110 | /* FORMS */ 111 | 112 | .aligned label { 113 | padding: 0 0 3px 1em; 114 | float: right; 115 | } 116 | 117 | .submit-row { 118 | text-align: left 119 | } 120 | 121 | .submit-row p.deletelink-box { 122 | float: right; 123 | } 124 | 125 | .submit-row input.default { 126 | margin-left: 0; 127 | } 128 | 129 | .vDateField, .vTimeField { 130 | margin-left: 2px; 131 | } 132 | 133 | .aligned .form-row input { 134 | margin-left: 5px; 135 | } 136 | 137 | form .aligned p.help, form .aligned div.help { 138 | clear: right; 139 | } 140 | 141 | form .aligned ul { 142 | margin-right: 163px; 143 | margin-left: 0; 144 | } 145 | 146 | form ul.inline li { 147 | float: right; 148 | padding-right: 0; 149 | padding-left: 7px; 150 | } 151 | 152 | input[type=submit].default, .submit-row input.default { 153 | float: left; 154 | } 155 | 156 | fieldset .fieldBox { 157 | float: right; 158 | margin-left: 20px; 159 | margin-right: 0; 160 | } 161 | 162 | .errorlist li { 163 | background-position: 100% 12px; 164 | padding: 0; 165 | } 166 | 167 | .errornote { 168 | background-position: 100% 12px; 169 | padding: 10px 12px; 170 | } 171 | 172 | /* WIDGETS */ 173 | 174 | .calendarnav-previous { 175 | top: 0; 176 | left: auto; 177 | right: 10px; 178 | } 179 | 180 | .calendarnav-next { 181 | top: 0; 182 | right: auto; 183 | left: 10px; 184 | } 185 | 186 | .calendar caption, .calendarbox h2 { 187 | text-align: center; 188 | } 189 | 190 | .selector { 191 | float: right; 192 | } 193 | 194 | .selector .selector-filter { 195 | text-align: right; 196 | } 197 | 198 | .inline-deletelink { 199 | float: left; 200 | } 201 | 202 | form .form-row p.datetime { 203 | overflow: hidden; 204 | } 205 | 206 | .related-widget-wrapper { 207 | float: right; 208 | } 209 | 210 | /* MISC */ 211 | 212 | .inline-related h2, .inline-group h2 { 213 | text-align: right 214 | } 215 | 216 | .inline-related h3 span.delete { 217 | padding-right: 20px; 218 | padding-left: inherit; 219 | left: 10px; 220 | right: inherit; 221 | float:left; 222 | } 223 | 224 | .inline-related h3 span.delete label { 225 | margin-left: inherit; 226 | margin-right: 2px; 227 | } 228 | -------------------------------------------------------------------------------- /static_cdn/admin/css/vendor/select2/LICENSE-SELECT2.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /static_cdn/admin/fonts/README.txt: -------------------------------------------------------------------------------- 1 | Roboto webfont source: https://www.google.com/fonts/specimen/Roboto 2 | WOFF files extracted using https://github.com/majodev/google-webfonts-helper 3 | Weights used in this project: Light (300), Regular (400), Bold (700) 4 | -------------------------------------------------------------------------------- /static_cdn/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/static_cdn/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /static_cdn/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/static_cdn/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /static_cdn/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/damoo17/Blogpostproject1/2e636bbed7c9d368f851bfbe39b7d35b1f23554a/static_cdn/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /static_cdn/admin/img/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Code Charm Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /static_cdn/admin/img/README.txt: -------------------------------------------------------------------------------- 1 | All icons are taken from Font Awesome (http://fontawesome.io/) project. 2 | The Font Awesome font is licensed under the SIL OFL 1.1: 3 | - https://scripts.sil.org/OFL 4 | 5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG 6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license 7 | in current folder). 8 | -------------------------------------------------------------------------------- /static_cdn/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /static_cdn/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static_cdn/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-viewlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/selector-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /static_cdn/admin/img/sorting-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /static_cdn/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static_cdn/admin/js/SelectBox.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const SelectBox = { 4 | cache: {}, 5 | init: function(id) { 6 | const box = document.getElementById(id); 7 | SelectBox.cache[id] = []; 8 | const cache = SelectBox.cache[id]; 9 | for (const node of box.options) { 10 | cache.push({value: node.value, text: node.text, displayed: 1}); 11 | } 12 | }, 13 | redisplay: function(id) { 14 | // Repopulate HTML select box from cache 15 | const box = document.getElementById(id); 16 | const scroll_value_from_top = box.scrollTop; 17 | box.innerHTML = ''; 18 | for (const node of SelectBox.cache[id]) { 19 | if (node.displayed) { 20 | const new_option = new Option(node.text, node.value, false, false); 21 | // Shows a tooltip when hovering over the option 22 | new_option.title = node.text; 23 | box.appendChild(new_option); 24 | } 25 | } 26 | box.scrollTop = scroll_value_from_top; 27 | }, 28 | filter: function(id, text) { 29 | // Redisplay the HTML select box, displaying only the choices containing ALL 30 | // the words in text. (It's an AND search.) 31 | const tokens = text.toLowerCase().split(/\s+/); 32 | for (const node of SelectBox.cache[id]) { 33 | node.displayed = 1; 34 | const node_text = node.text.toLowerCase(); 35 | for (const token of tokens) { 36 | if (!node_text.includes(token)) { 37 | node.displayed = 0; 38 | break; // Once the first token isn't found we're done 39 | } 40 | } 41 | } 42 | SelectBox.redisplay(id); 43 | }, 44 | delete_from_cache: function(id, value) { 45 | let delete_index = null; 46 | const cache = SelectBox.cache[id]; 47 | for (const [i, node] of cache.entries()) { 48 | if (node.value === value) { 49 | delete_index = i; 50 | break; 51 | } 52 | } 53 | cache.splice(delete_index, 1); 54 | }, 55 | add_to_cache: function(id, option) { 56 | SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); 57 | }, 58 | cache_contains: function(id, value) { 59 | // Check if an item is contained in the cache 60 | for (const node of SelectBox.cache[id]) { 61 | if (node.value === value) { 62 | return true; 63 | } 64 | } 65 | return false; 66 | }, 67 | move: function(from, to) { 68 | const from_box = document.getElementById(from); 69 | for (const option of from_box.options) { 70 | const option_value = option.value; 71 | if (option.selected && SelectBox.cache_contains(from, option_value)) { 72 | SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); 73 | SelectBox.delete_from_cache(from, option_value); 74 | } 75 | } 76 | SelectBox.redisplay(from); 77 | SelectBox.redisplay(to); 78 | }, 79 | move_all: function(from, to) { 80 | const from_box = document.getElementById(from); 81 | for (const option of from_box.options) { 82 | const option_value = option.value; 83 | if (SelectBox.cache_contains(from, option_value)) { 84 | SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); 85 | SelectBox.delete_from_cache(from, option_value); 86 | } 87 | } 88 | SelectBox.redisplay(from); 89 | SelectBox.redisplay(to); 90 | }, 91 | sort: function(id) { 92 | SelectBox.cache[id].sort(function(a, b) { 93 | a = a.text.toLowerCase(); 94 | b = b.text.toLowerCase(); 95 | if (a > b) { 96 | return 1; 97 | } 98 | if (a < b) { 99 | return -1; 100 | } 101 | return 0; 102 | } ); 103 | }, 104 | select_all: function(id) { 105 | const box = document.getElementById(id); 106 | for (const option of box.options) { 107 | option.selected = true; 108 | } 109 | } 110 | }; 111 | window.SelectBox = SelectBox; 112 | } 113 | -------------------------------------------------------------------------------- /static_cdn/admin/js/actions.js: -------------------------------------------------------------------------------- 1 | /*global gettext, interpolate, ngettext*/ 2 | 'use strict'; 3 | { 4 | function show(selector) { 5 | document.querySelectorAll(selector).forEach(function(el) { 6 | el.classList.remove('hidden'); 7 | }); 8 | } 9 | 10 | function hide(selector) { 11 | document.querySelectorAll(selector).forEach(function(el) { 12 | el.classList.add('hidden'); 13 | }); 14 | } 15 | 16 | function showQuestion(options) { 17 | hide(options.acrossClears); 18 | show(options.acrossQuestions); 19 | hide(options.allContainer); 20 | } 21 | 22 | function showClear(options) { 23 | show(options.acrossClears); 24 | hide(options.acrossQuestions); 25 | document.querySelector(options.actionContainer).classList.remove(options.selectedClass); 26 | show(options.allContainer); 27 | hide(options.counterContainer); 28 | } 29 | 30 | function reset(options) { 31 | hide(options.acrossClears); 32 | hide(options.acrossQuestions); 33 | hide(options.allContainer); 34 | show(options.counterContainer); 35 | } 36 | 37 | function clearAcross(options) { 38 | reset(options); 39 | const acrossInputs = document.querySelectorAll(options.acrossInput); 40 | acrossInputs.forEach(function(acrossInput) { 41 | acrossInput.value = 0; 42 | }); 43 | document.querySelector(options.actionContainer).classList.remove(options.selectedClass); 44 | } 45 | 46 | function checker(actionCheckboxes, options, checked) { 47 | if (checked) { 48 | showQuestion(options); 49 | } else { 50 | reset(options); 51 | } 52 | actionCheckboxes.forEach(function(el) { 53 | el.checked = checked; 54 | el.closest('tr').classList.toggle(options.selectedClass, checked); 55 | }); 56 | } 57 | 58 | function updateCounter(actionCheckboxes, options) { 59 | const sel = Array.from(actionCheckboxes).filter(function(el) { 60 | return el.checked; 61 | }).length; 62 | const counter = document.querySelector(options.counterContainer); 63 | // data-actions-icnt is defined in the generated HTML 64 | // and contains the total amount of objects in the queryset 65 | const actions_icnt = Number(counter.dataset.actionsIcnt); 66 | counter.textContent = interpolate( 67 | ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { 68 | sel: sel, 69 | cnt: actions_icnt 70 | }, true); 71 | const allToggle = document.getElementById(options.allToggleId); 72 | allToggle.checked = sel === actionCheckboxes.length; 73 | if (allToggle.checked) { 74 | showQuestion(options); 75 | } else { 76 | clearAcross(options); 77 | } 78 | } 79 | 80 | const defaults = { 81 | actionContainer: "div.actions", 82 | counterContainer: "span.action-counter", 83 | allContainer: "div.actions span.all", 84 | acrossInput: "div.actions input.select-across", 85 | acrossQuestions: "div.actions span.question", 86 | acrossClears: "div.actions span.clear", 87 | allToggleId: "action-toggle", 88 | selectedClass: "selected" 89 | }; 90 | 91 | window.Actions = function(actionCheckboxes, options) { 92 | options = Object.assign({}, defaults, options); 93 | let list_editable_changed = false; 94 | let lastChecked = null; 95 | let shiftPressed = false; 96 | 97 | document.addEventListener('keydown', (event) => { 98 | shiftPressed = event.shiftKey; 99 | }); 100 | 101 | document.addEventListener('keyup', (event) => { 102 | shiftPressed = event.shiftKey; 103 | }); 104 | 105 | document.getElementById(options.allToggleId).addEventListener('click', function(event) { 106 | checker(actionCheckboxes, options, this.checked); 107 | updateCounter(actionCheckboxes, options); 108 | }); 109 | 110 | document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { 111 | el.addEventListener('click', function(event) { 112 | event.preventDefault(); 113 | const acrossInputs = document.querySelectorAll(options.acrossInput); 114 | acrossInputs.forEach(function(acrossInput) { 115 | acrossInput.value = 1; 116 | }); 117 | showClear(options); 118 | }); 119 | }); 120 | 121 | document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { 122 | el.addEventListener('click', function(event) { 123 | event.preventDefault(); 124 | document.getElementById(options.allToggleId).checked = false; 125 | clearAcross(options); 126 | checker(actionCheckboxes, options, false); 127 | updateCounter(actionCheckboxes, options); 128 | }); 129 | }); 130 | 131 | function affectedCheckboxes(target, withModifier) { 132 | const multiSelect = (lastChecked && withModifier && lastChecked !== target); 133 | if (!multiSelect) { 134 | return [target]; 135 | } 136 | const checkboxes = Array.from(actionCheckboxes); 137 | const targetIndex = checkboxes.findIndex(el => el === target); 138 | const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); 139 | const startIndex = Math.min(targetIndex, lastCheckedIndex); 140 | const endIndex = Math.max(targetIndex, lastCheckedIndex); 141 | const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); 142 | return filtered; 143 | }; 144 | 145 | Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { 146 | el.addEventListener('change', function(event) { 147 | const target = event.target; 148 | if (target.classList.contains('action-select')) { 149 | const checkboxes = affectedCheckboxes(target, shiftPressed); 150 | checker(checkboxes, options, target.checked); 151 | updateCounter(actionCheckboxes, options); 152 | lastChecked = target; 153 | } else { 154 | list_editable_changed = true; 155 | } 156 | }); 157 | }); 158 | 159 | document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { 160 | if (list_editable_changed) { 161 | const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); 162 | if (!confirmed) { 163 | event.preventDefault(); 164 | } 165 | } 166 | }); 167 | 168 | const el = document.querySelector('#changelist-form input[name=_save]'); 169 | // The button does not exist if no fields are editable. 170 | if (el) { 171 | el.addEventListener('click', function(event) { 172 | if (document.querySelector('[name=action]').value) { 173 | const text = list_editable_changed 174 | ? 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.") 175 | : 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."); 176 | if (!confirm(text)) { 177 | event.preventDefault(); 178 | } 179 | } 180 | }); 181 | } 182 | }; 183 | 184 | // Call function fn when the DOM is loaded and ready. If it is already 185 | // loaded, call the function now. 186 | // http://youmightnotneedjquery.com/#ready 187 | function ready(fn) { 188 | if (document.readyState !== 'loading') { 189 | fn(); 190 | } else { 191 | document.addEventListener('DOMContentLoaded', fn); 192 | } 193 | } 194 | 195 | ready(function() { 196 | const actionsEls = document.querySelectorAll('tr input.action-select'); 197 | if (actionsEls.length > 0) { 198 | Actions(actionsEls); 199 | } 200 | }); 201 | } 202 | -------------------------------------------------------------------------------- /static_cdn/admin/js/admin/RelatedObjectLookups.js: -------------------------------------------------------------------------------- 1 | /*global SelectBox, interpolate*/ 2 | // Handles related-objects functionality: lookup link for raw_id_fields 3 | // and Add Another links. 4 | 'use strict'; 5 | { 6 | const $ = django.jQuery; 7 | 8 | function showAdminPopup(triggeringLink, name_regexp, add_popup) { 9 | const name = triggeringLink.id.replace(name_regexp, ''); 10 | const href = new URL(triggeringLink.href); 11 | if (add_popup) { 12 | href.searchParams.set('_popup', 1); 13 | } 14 | const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); 15 | win.focus(); 16 | return false; 17 | } 18 | 19 | function showRelatedObjectLookupPopup(triggeringLink) { 20 | return showAdminPopup(triggeringLink, /^lookup_/, true); 21 | } 22 | 23 | function dismissRelatedLookupPopup(win, chosenId) { 24 | const name = win.name; 25 | const elem = document.getElementById(name); 26 | if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { 27 | elem.value += ',' + chosenId; 28 | } else { 29 | document.getElementById(name).value = chosenId; 30 | } 31 | win.close(); 32 | } 33 | 34 | function showRelatedObjectPopup(triggeringLink) { 35 | return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); 36 | } 37 | 38 | function updateRelatedObjectLinks(triggeringLink) { 39 | const $this = $(triggeringLink); 40 | const siblings = $this.nextAll('.view-related, .change-related, .delete-related'); 41 | if (!siblings.length) { 42 | return; 43 | } 44 | const value = $this.val(); 45 | if (value) { 46 | siblings.each(function() { 47 | const elm = $(this); 48 | elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); 49 | }); 50 | } else { 51 | siblings.removeAttr('href'); 52 | } 53 | } 54 | 55 | function dismissAddRelatedObjectPopup(win, newId, newRepr) { 56 | const name = win.name; 57 | const elem = document.getElementById(name); 58 | if (elem) { 59 | const elemName = elem.nodeName.toUpperCase(); 60 | if (elemName === 'SELECT') { 61 | elem.options[elem.options.length] = new Option(newRepr, newId, true, true); 62 | } else if (elemName === 'INPUT') { 63 | if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { 64 | elem.value += ',' + newId; 65 | } else { 66 | elem.value = newId; 67 | } 68 | } 69 | // Trigger a change event to update related links if required. 70 | $(elem).trigger('change'); 71 | } else { 72 | const toId = name + "_to"; 73 | const o = new Option(newRepr, newId); 74 | SelectBox.add_to_cache(toId, o); 75 | SelectBox.redisplay(toId); 76 | } 77 | win.close(); 78 | } 79 | 80 | function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { 81 | const id = win.name.replace(/^edit_/, ''); 82 | const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); 83 | const selects = $(selectsSelector); 84 | selects.find('option').each(function() { 85 | if (this.value === objId) { 86 | this.textContent = newRepr; 87 | this.value = newId; 88 | } 89 | }); 90 | selects.next().find('.select2-selection__rendered').each(function() { 91 | // The element can have a clear button as a child. 92 | // Use the lastChild to modify only the displayed value. 93 | this.lastChild.textContent = newRepr; 94 | this.title = newRepr; 95 | }); 96 | win.close(); 97 | } 98 | 99 | function dismissDeleteRelatedObjectPopup(win, objId) { 100 | const id = win.name.replace(/^delete_/, ''); 101 | const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); 102 | const selects = $(selectsSelector); 103 | selects.find('option').each(function() { 104 | if (this.value === objId) { 105 | $(this).remove(); 106 | } 107 | }).trigger('change'); 108 | win.close(); 109 | } 110 | 111 | window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; 112 | window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; 113 | window.showRelatedObjectPopup = showRelatedObjectPopup; 114 | window.updateRelatedObjectLinks = updateRelatedObjectLinks; 115 | window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; 116 | window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; 117 | window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; 118 | 119 | // Kept for backward compatibility 120 | window.showAddAnotherPopup = showRelatedObjectPopup; 121 | window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; 122 | 123 | $(document).ready(function() { 124 | $("a[data-popup-opener]").on('click', function(event) { 125 | event.preventDefault(); 126 | opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); 127 | }); 128 | $('body').on('click', '.related-widget-wrapper-link', function(e) { 129 | e.preventDefault(); 130 | if (this.href) { 131 | const event = $.Event('django:show-related', {href: this.href}); 132 | $(this).trigger(event); 133 | if (!event.isDefaultPrevented()) { 134 | showRelatedObjectPopup(this); 135 | } 136 | } 137 | }); 138 | $('body').on('change', '.related-widget-wrapper select', function(e) { 139 | const event = $.Event('django:update-related'); 140 | $(this).trigger(event); 141 | if (!event.isDefaultPrevented()) { 142 | updateRelatedObjectLinks(this); 143 | } 144 | }); 145 | $('.related-widget-wrapper select').trigger('change'); 146 | $('body').on('click', '.related-lookup', function(e) { 147 | e.preventDefault(); 148 | const event = $.Event('django:lookup-related'); 149 | $(this).trigger(event); 150 | if (!event.isDefaultPrevented()) { 151 | showRelatedObjectLookupPopup(this); 152 | } 153 | }); 154 | }); 155 | } 156 | -------------------------------------------------------------------------------- /static_cdn/admin/js/autocomplete.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const $ = django.jQuery; 4 | 5 | $.fn.djangoAdminSelect2 = function() { 6 | $.each(this, function(i, element) { 7 | $(element).select2({ 8 | ajax: { 9 | data: (params) => { 10 | return { 11 | term: params.term, 12 | page: params.page, 13 | app_label: element.dataset.appLabel, 14 | model_name: element.dataset.modelName, 15 | field_name: element.dataset.fieldName 16 | }; 17 | } 18 | } 19 | }); 20 | }); 21 | return this; 22 | }; 23 | 24 | $(function() { 25 | // Initialize all autocomplete widgets except the one in the template 26 | // form used when a new formset is added. 27 | $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); 28 | }); 29 | 30 | $(document).on('formset:added', (function() { 31 | return function(event, $newFormset) { 32 | return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); 33 | }; 34 | })(this)); 35 | } 36 | -------------------------------------------------------------------------------- /static_cdn/admin/js/calendar.js: -------------------------------------------------------------------------------- 1 | /*global gettext, pgettext, get_format, quickElement, removeChildren*/ 2 | /* 3 | calendar.js - Calendar functions by Adrian Holovaty 4 | depends on core.js for utility functions like removeChildren or quickElement 5 | */ 6 | 'use strict'; 7 | { 8 | // CalendarNamespace -- Provides a collection of HTML calendar-related helper functions 9 | const CalendarNamespace = { 10 | monthsOfYear: [ 11 | gettext('January'), 12 | gettext('February'), 13 | gettext('March'), 14 | gettext('April'), 15 | gettext('May'), 16 | gettext('June'), 17 | gettext('July'), 18 | gettext('August'), 19 | gettext('September'), 20 | gettext('October'), 21 | gettext('November'), 22 | gettext('December') 23 | ], 24 | monthsOfYearAbbrev: [ 25 | pgettext('abbrev. month January', 'Jan'), 26 | pgettext('abbrev. month February', 'Feb'), 27 | pgettext('abbrev. month March', 'Mar'), 28 | pgettext('abbrev. month April', 'Apr'), 29 | pgettext('abbrev. month May', 'May'), 30 | pgettext('abbrev. month June', 'Jun'), 31 | pgettext('abbrev. month July', 'Jul'), 32 | pgettext('abbrev. month August', 'Aug'), 33 | pgettext('abbrev. month September', 'Sep'), 34 | pgettext('abbrev. month October', 'Oct'), 35 | pgettext('abbrev. month November', 'Nov'), 36 | pgettext('abbrev. month December', 'Dec') 37 | ], 38 | daysOfWeek: [ 39 | pgettext('one letter Sunday', 'S'), 40 | pgettext('one letter Monday', 'M'), 41 | pgettext('one letter Tuesday', 'T'), 42 | pgettext('one letter Wednesday', 'W'), 43 | pgettext('one letter Thursday', 'T'), 44 | pgettext('one letter Friday', 'F'), 45 | pgettext('one letter Saturday', 'S') 46 | ], 47 | firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), 48 | isLeapYear: function(year) { 49 | return (((year % 4) === 0) && ((year % 100) !== 0 ) || ((year % 400) === 0)); 50 | }, 51 | getDaysInMonth: function(month, year) { 52 | let days; 53 | if (month === 1 || month === 3 || month === 5 || month === 7 || month === 8 || month === 10 || month === 12) { 54 | days = 31; 55 | } 56 | else if (month === 4 || month === 6 || month === 9 || month === 11) { 57 | days = 30; 58 | } 59 | else if (month === 2 && CalendarNamespace.isLeapYear(year)) { 60 | days = 29; 61 | } 62 | else { 63 | days = 28; 64 | } 65 | return days; 66 | }, 67 | draw: function(month, year, div_id, callback, selected) { // month = 1-12, year = 1-9999 68 | const today = new Date(); 69 | const todayDay = today.getDate(); 70 | const todayMonth = today.getMonth() + 1; 71 | const todayYear = today.getFullYear(); 72 | let todayClass = ''; 73 | 74 | // Use UTC functions here because the date field does not contain time 75 | // and using the UTC function variants prevent the local time offset 76 | // from altering the date, specifically the day field. For example: 77 | // 78 | // ``` 79 | // var x = new Date('2013-10-02'); 80 | // var day = x.getDate(); 81 | // ``` 82 | // 83 | // The day variable above will be 1 instead of 2 in, say, US Pacific time 84 | // zone. 85 | let isSelectedMonth = false; 86 | if (typeof selected !== 'undefined') { 87 | isSelectedMonth = (selected.getUTCFullYear() === year && (selected.getUTCMonth() + 1) === month); 88 | } 89 | 90 | month = parseInt(month); 91 | year = parseInt(year); 92 | const calDiv = document.getElementById(div_id); 93 | removeChildren(calDiv); 94 | const calTable = document.createElement('table'); 95 | quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year); 96 | const tableBody = quickElement('tbody', calTable); 97 | 98 | // Draw days-of-week header 99 | let tableRow = quickElement('tr', tableBody); 100 | for (let i = 0; i < 7; i++) { 101 | quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]); 102 | } 103 | 104 | const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); 105 | const days = CalendarNamespace.getDaysInMonth(month, year); 106 | 107 | let nonDayCell; 108 | 109 | // Draw blanks before first of month 110 | tableRow = quickElement('tr', tableBody); 111 | for (let i = 0; i < startingPos; i++) { 112 | nonDayCell = quickElement('td', tableRow, ' '); 113 | nonDayCell.className = "nonday"; 114 | } 115 | 116 | function calendarMonth(y, m) { 117 | function onClick(e) { 118 | e.preventDefault(); 119 | callback(y, m, this.textContent); 120 | } 121 | return onClick; 122 | } 123 | 124 | // Draw days of month 125 | let currentDay = 1; 126 | for (let i = startingPos; currentDay <= days; i++) { 127 | if (i % 7 === 0 && currentDay !== 1) { 128 | tableRow = quickElement('tr', tableBody); 129 | } 130 | if ((currentDay === todayDay) && (month === todayMonth) && (year === todayYear)) { 131 | todayClass = 'today'; 132 | } else { 133 | todayClass = ''; 134 | } 135 | 136 | // use UTC function; see above for explanation. 137 | if (isSelectedMonth && currentDay === selected.getUTCDate()) { 138 | if (todayClass !== '') { 139 | todayClass += " "; 140 | } 141 | todayClass += "selected"; 142 | } 143 | 144 | const cell = quickElement('td', tableRow, '', 'class', todayClass); 145 | const link = quickElement('a', cell, currentDay, 'href', '#'); 146 | link.addEventListener('click', calendarMonth(year, month)); 147 | currentDay++; 148 | } 149 | 150 | // Draw blanks after end of month (optional, but makes for valid code) 151 | while (tableRow.childNodes.length < 7) { 152 | nonDayCell = quickElement('td', tableRow, ' '); 153 | nonDayCell.className = "nonday"; 154 | } 155 | 156 | calDiv.appendChild(calTable); 157 | } 158 | }; 159 | 160 | // Calendar -- A calendar instance 161 | function Calendar(div_id, callback, selected) { 162 | // div_id (string) is the ID of the element in which the calendar will 163 | // be displayed 164 | // callback (string) is the name of a JavaScript function that will be 165 | // called with the parameters (year, month, day) when a day in the 166 | // calendar is clicked 167 | this.div_id = div_id; 168 | this.callback = callback; 169 | this.today = new Date(); 170 | this.currentMonth = this.today.getMonth() + 1; 171 | this.currentYear = this.today.getFullYear(); 172 | if (typeof selected !== 'undefined') { 173 | this.selected = selected; 174 | } 175 | } 176 | Calendar.prototype = { 177 | drawCurrent: function() { 178 | CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback, this.selected); 179 | }, 180 | drawDate: function(month, year, selected) { 181 | this.currentMonth = month; 182 | this.currentYear = year; 183 | 184 | if(selected) { 185 | this.selected = selected; 186 | } 187 | 188 | this.drawCurrent(); 189 | }, 190 | drawPreviousMonth: function() { 191 | if (this.currentMonth === 1) { 192 | this.currentMonth = 12; 193 | this.currentYear--; 194 | } 195 | else { 196 | this.currentMonth--; 197 | } 198 | this.drawCurrent(); 199 | }, 200 | drawNextMonth: function() { 201 | if (this.currentMonth === 12) { 202 | this.currentMonth = 1; 203 | this.currentYear++; 204 | } 205 | else { 206 | this.currentMonth++; 207 | } 208 | this.drawCurrent(); 209 | }, 210 | drawPreviousYear: function() { 211 | this.currentYear--; 212 | this.drawCurrent(); 213 | }, 214 | drawNextYear: function() { 215 | this.currentYear++; 216 | this.drawCurrent(); 217 | } 218 | }; 219 | window.Calendar = Calendar; 220 | window.CalendarNamespace = CalendarNamespace; 221 | } 222 | -------------------------------------------------------------------------------- /static_cdn/admin/js/cancel.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | // Call function fn when the DOM is loaded and ready. If it is already 4 | // loaded, call the function now. 5 | // http://youmightnotneedjquery.com/#ready 6 | function ready(fn) { 7 | if (document.readyState !== 'loading') { 8 | fn(); 9 | } else { 10 | document.addEventListener('DOMContentLoaded', fn); 11 | } 12 | } 13 | 14 | ready(function() { 15 | function handleClick(event) { 16 | event.preventDefault(); 17 | const params = new URLSearchParams(window.location.search); 18 | if (params.has('_popup')) { 19 | window.close(); // Close the popup. 20 | } else { 21 | window.history.back(); // Otherwise, go back. 22 | } 23 | } 24 | 25 | document.querySelectorAll('.cancel-link').forEach(function(el) { 26 | el.addEventListener('click', handleClick); 27 | }); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /static_cdn/admin/js/change_form.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA']; 4 | const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName; 5 | if (modelName) { 6 | const form = document.getElementById(modelName + '_form'); 7 | for (const element of form.elements) { 8 | // HTMLElement.offsetParent returns null when the element is not 9 | // rendered. 10 | if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) { 11 | element.focus(); 12 | break; 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /static_cdn/admin/js/collapse.js: -------------------------------------------------------------------------------- 1 | /*global gettext*/ 2 | 'use strict'; 3 | { 4 | window.addEventListener('load', function() { 5 | // Add anchor tag for Show/Hide link 6 | const fieldsets = document.querySelectorAll('fieldset.collapse'); 7 | for (const [i, elem] of fieldsets.entries()) { 8 | // Don't hide if fields in this fieldset have errors 9 | if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) { 10 | elem.classList.add('collapsed'); 11 | const h2 = elem.querySelector('h2'); 12 | const link = document.createElement('a'); 13 | link.id = 'fieldsetcollapser' + i; 14 | link.className = 'collapse-toggle'; 15 | link.href = '#'; 16 | link.textContent = gettext('Show'); 17 | h2.appendChild(document.createTextNode(' (')); 18 | h2.appendChild(link); 19 | h2.appendChild(document.createTextNode(')')); 20 | } 21 | } 22 | // Add toggle to hide/show anchor tag 23 | const toggleFunc = function(ev) { 24 | if (ev.target.matches('.collapse-toggle')) { 25 | ev.preventDefault(); 26 | ev.stopPropagation(); 27 | const fieldset = ev.target.closest('fieldset'); 28 | if (fieldset.classList.contains('collapsed')) { 29 | // Show 30 | ev.target.textContent = gettext('Hide'); 31 | fieldset.classList.remove('collapsed'); 32 | } else { 33 | // Hide 34 | ev.target.textContent = gettext('Show'); 35 | fieldset.classList.add('collapsed'); 36 | } 37 | } 38 | }; 39 | document.querySelectorAll('fieldset.module').forEach(function(el) { 40 | el.addEventListener('click', toggleFunc); 41 | }); 42 | }); 43 | } 44 | -------------------------------------------------------------------------------- /static_cdn/admin/js/core.js: -------------------------------------------------------------------------------- 1 | // Core JavaScript helper functions 2 | 'use strict'; 3 | 4 | // quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); 5 | function quickElement() { 6 | const obj = document.createElement(arguments[0]); 7 | if (arguments[2]) { 8 | const textNode = document.createTextNode(arguments[2]); 9 | obj.appendChild(textNode); 10 | } 11 | const len = arguments.length; 12 | for (let i = 3; i < len; i += 2) { 13 | obj.setAttribute(arguments[i], arguments[i + 1]); 14 | } 15 | arguments[1].appendChild(obj); 16 | return obj; 17 | } 18 | 19 | // "a" is reference to an object 20 | function removeChildren(a) { 21 | while (a.hasChildNodes()) { 22 | a.removeChild(a.lastChild); 23 | } 24 | } 25 | 26 | // ---------------------------------------------------------------------------- 27 | // Find-position functions by PPK 28 | // See https://www.quirksmode.org/js/findpos.html 29 | // ---------------------------------------------------------------------------- 30 | function findPosX(obj) { 31 | let curleft = 0; 32 | if (obj.offsetParent) { 33 | while (obj.offsetParent) { 34 | curleft += obj.offsetLeft - obj.scrollLeft; 35 | obj = obj.offsetParent; 36 | } 37 | } else if (obj.x) { 38 | curleft += obj.x; 39 | } 40 | return curleft; 41 | } 42 | 43 | function findPosY(obj) { 44 | let curtop = 0; 45 | if (obj.offsetParent) { 46 | while (obj.offsetParent) { 47 | curtop += obj.offsetTop - obj.scrollTop; 48 | obj = obj.offsetParent; 49 | } 50 | } else if (obj.y) { 51 | curtop += obj.y; 52 | } 53 | return curtop; 54 | } 55 | 56 | //----------------------------------------------------------------------------- 57 | // Date object extensions 58 | // ---------------------------------------------------------------------------- 59 | { 60 | Date.prototype.getTwelveHours = function() { 61 | return this.getHours() % 12 || 12; 62 | }; 63 | 64 | Date.prototype.getTwoDigitMonth = function() { 65 | return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1); 66 | }; 67 | 68 | Date.prototype.getTwoDigitDate = function() { 69 | return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); 70 | }; 71 | 72 | Date.prototype.getTwoDigitTwelveHour = function() { 73 | return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); 74 | }; 75 | 76 | Date.prototype.getTwoDigitHour = function() { 77 | return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); 78 | }; 79 | 80 | Date.prototype.getTwoDigitMinute = function() { 81 | return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); 82 | }; 83 | 84 | Date.prototype.getTwoDigitSecond = function() { 85 | return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); 86 | }; 87 | 88 | Date.prototype.getAbbrevMonthName = function() { 89 | return typeof window.CalendarNamespace === "undefined" 90 | ? this.getTwoDigitMonth() 91 | : window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()]; 92 | }; 93 | 94 | Date.prototype.getFullMonthName = function() { 95 | return typeof window.CalendarNamespace === "undefined" 96 | ? this.getTwoDigitMonth() 97 | : window.CalendarNamespace.monthsOfYear[this.getMonth()]; 98 | }; 99 | 100 | Date.prototype.strftime = function(format) { 101 | const fields = { 102 | b: this.getAbbrevMonthName(), 103 | B: this.getFullMonthName(), 104 | c: this.toString(), 105 | d: this.getTwoDigitDate(), 106 | H: this.getTwoDigitHour(), 107 | I: this.getTwoDigitTwelveHour(), 108 | m: this.getTwoDigitMonth(), 109 | M: this.getTwoDigitMinute(), 110 | p: (this.getHours() >= 12) ? 'PM' : 'AM', 111 | S: this.getTwoDigitSecond(), 112 | w: '0' + this.getDay(), 113 | x: this.toLocaleDateString(), 114 | X: this.toLocaleTimeString(), 115 | y: ('' + this.getFullYear()).substr(2, 4), 116 | Y: '' + this.getFullYear(), 117 | '%': '%' 118 | }; 119 | let result = '', i = 0; 120 | while (i < format.length) { 121 | if (format.charAt(i) === '%') { 122 | result = result + fields[format.charAt(i + 1)]; 123 | ++i; 124 | } 125 | else { 126 | result = result + format.charAt(i); 127 | } 128 | ++i; 129 | } 130 | return result; 131 | }; 132 | 133 | // ---------------------------------------------------------------------------- 134 | // String object extensions 135 | // ---------------------------------------------------------------------------- 136 | String.prototype.strptime = function(format) { 137 | const split_format = format.split(/[.\-/]/); 138 | const date = this.split(/[.\-/]/); 139 | let i = 0; 140 | let day, month, year; 141 | while (i < split_format.length) { 142 | switch (split_format[i]) { 143 | case "%d": 144 | day = date[i]; 145 | break; 146 | case "%m": 147 | month = date[i] - 1; 148 | break; 149 | case "%Y": 150 | year = date[i]; 151 | break; 152 | case "%y": 153 | // A %y value in the range of [00, 68] is in the current 154 | // century, while [69, 99] is in the previous century, 155 | // according to the Open Group Specification. 156 | if (parseInt(date[i], 10) >= 69) { 157 | year = date[i]; 158 | } else { 159 | year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100; 160 | } 161 | break; 162 | } 163 | ++i; 164 | } 165 | // Create Date object from UTC since the parsed value is supposed to be 166 | // in UTC, not local time. Also, the calendar uses UTC functions for 167 | // date extraction. 168 | return new Date(Date.UTC(year, month, day)); 169 | }; 170 | } 171 | -------------------------------------------------------------------------------- /static_cdn/admin/js/jquery.init.js: -------------------------------------------------------------------------------- 1 | /*global jQuery:false*/ 2 | 'use strict'; 3 | /* Puts the included jQuery into our own namespace using noConflict and passing 4 | * it 'true'. This ensures that the included jQuery doesn't pollute the global 5 | * namespace (i.e. this preserves pre-existing values for both window.$ and 6 | * window.jQuery). 7 | */ 8 | window.django = {jQuery: jQuery.noConflict(true)}; 9 | -------------------------------------------------------------------------------- /static_cdn/admin/js/nav_sidebar.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); 4 | if (toggleNavSidebar !== null) { 5 | const navLinks = document.querySelectorAll('#nav-sidebar a'); 6 | function disableNavLinkTabbing() { 7 | for (const navLink of navLinks) { 8 | navLink.tabIndex = -1; 9 | } 10 | } 11 | function enableNavLinkTabbing() { 12 | for (const navLink of navLinks) { 13 | navLink.tabIndex = 0; 14 | } 15 | } 16 | 17 | const main = document.getElementById('main'); 18 | let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); 19 | if (navSidebarIsOpen === null) { 20 | navSidebarIsOpen = 'true'; 21 | } 22 | if (navSidebarIsOpen === 'false') { 23 | disableNavLinkTabbing(); 24 | } 25 | main.classList.toggle('shifted', navSidebarIsOpen === 'true'); 26 | 27 | toggleNavSidebar.addEventListener('click', function() { 28 | if (navSidebarIsOpen === 'true') { 29 | navSidebarIsOpen = 'false'; 30 | disableNavLinkTabbing(); 31 | } else { 32 | navSidebarIsOpen = 'true'; 33 | enableNavLinkTabbing(); 34 | } 35 | localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); 36 | main.classList.toggle('shifted'); 37 | }); 38 | } 39 | 40 | function initSidebarQuickFilter() { 41 | const options = []; 42 | const navSidebar = document.getElementById('nav-sidebar'); 43 | if (!navSidebar) { 44 | return; 45 | } 46 | navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { 47 | options.push({title: container.innerHTML, node: container}); 48 | }); 49 | 50 | function checkValue(event) { 51 | let filterValue = event.target.value; 52 | if (filterValue) { 53 | filterValue = filterValue.toLowerCase(); 54 | } 55 | if (event.key === 'Escape') { 56 | filterValue = ''; 57 | event.target.value = ''; // clear input 58 | } 59 | let matches = false; 60 | for (const o of options) { 61 | let displayValue = ''; 62 | if (filterValue) { 63 | if (o.title.toLowerCase().indexOf(filterValue) === -1) { 64 | displayValue = 'none'; 65 | } else { 66 | matches = true; 67 | } 68 | } 69 | // show/hide parent 70 | o.node.parentNode.parentNode.style.display = displayValue; 71 | } 72 | if (!filterValue || matches) { 73 | event.target.classList.remove('no-results'); 74 | } else { 75 | event.target.classList.add('no-results'); 76 | } 77 | sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); 78 | } 79 | 80 | const nav = document.getElementById('nav-filter'); 81 | nav.addEventListener('change', checkValue, false); 82 | nav.addEventListener('input', checkValue, false); 83 | nav.addEventListener('keyup', checkValue, false); 84 | 85 | const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); 86 | if (storedValue) { 87 | nav.value = storedValue; 88 | checkValue({target: nav, key: ''}); 89 | } 90 | } 91 | window.initSidebarQuickFilter = initSidebarQuickFilter; 92 | initSidebarQuickFilter(); 93 | } 94 | -------------------------------------------------------------------------------- /static_cdn/admin/js/popup_response.js: -------------------------------------------------------------------------------- 1 | /*global opener */ 2 | 'use strict'; 3 | { 4 | const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); 5 | switch(initData.action) { 6 | case 'change': 7 | opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); 8 | break; 9 | case 'delete': 10 | opener.dismissDeleteRelatedObjectPopup(window, initData.value); 11 | break; 12 | default: 13 | opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); 14 | break; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /static_cdn/admin/js/prepopulate.js: -------------------------------------------------------------------------------- 1 | /*global URLify*/ 2 | 'use strict'; 3 | { 4 | const $ = django.jQuery; 5 | $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { 6 | /* 7 | Depends on urlify.js 8 | Populates a selected field with the values of the dependent fields, 9 | URLifies and shortens the string. 10 | dependencies - array of dependent fields ids 11 | maxLength - maximum length of the URLify'd string 12 | allowUnicode - Unicode support of the URLify'd string 13 | */ 14 | return this.each(function() { 15 | const prepopulatedField = $(this); 16 | 17 | const populate = function() { 18 | // Bail if the field's value has been changed by the user 19 | if (prepopulatedField.data('_changed')) { 20 | return; 21 | } 22 | 23 | const values = []; 24 | $.each(dependencies, function(i, field) { 25 | field = $(field); 26 | if (field.val().length > 0) { 27 | values.push(field.val()); 28 | } 29 | }); 30 | prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); 31 | }; 32 | 33 | prepopulatedField.data('_changed', false); 34 | prepopulatedField.on('change', function() { 35 | prepopulatedField.data('_changed', true); 36 | }); 37 | 38 | if (!prepopulatedField.val()) { 39 | $(dependencies.join(',')).on('keyup change focus', populate); 40 | } 41 | }); 42 | }; 43 | } 44 | -------------------------------------------------------------------------------- /static_cdn/admin/js/prepopulate_init.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const $ = django.jQuery; 4 | const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); 5 | $.each(fields, function(index, field) { 6 | $('.empty-form .form-row .field-' + field.name + ', .empty-form.form-row .field-' + field.name).addClass('prepopulated_field'); 7 | $(field.id).data('dependency_list', field.dependency_list).prepopulate( 8 | field.dependency_ids, field.maxLength, field.allowUnicode 9 | ); 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /static_cdn/admin/js/urlify.js: -------------------------------------------------------------------------------- 1 | /*global XRegExp*/ 2 | 'use strict'; 3 | { 4 | const LATIN_MAP = { 5 | 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 6 | 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 7 | 'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 8 | 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 9 | 'Ü': 'U', 'Ű': 'U', 'Ý': 'Y', 'Þ': 'TH', 'Ÿ': 'Y', 'ß': 'ss', 'à': 'a', 10 | 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 11 | 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', 12 | 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 13 | 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', 14 | 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' 15 | }; 16 | const LATIN_SYMBOLS_MAP = { 17 | '©': '(c)' 18 | }; 19 | const GREEK_MAP = { 20 | 'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', 21 | 'θ': '8', 'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', 22 | 'ο': 'o', 'π': 'p', 'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', 23 | 'χ': 'x', 'ψ': 'ps', 'ω': 'w', 'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', 24 | 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's', 'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', 25 | 'ΐ': 'i', 'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', 26 | 'Η': 'H', 'Θ': '8', 'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', 27 | 'Ξ': '3', 'Ο': 'O', 'Π': 'P', 'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', 28 | 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W', 'Ά': 'A', 'Έ': 'E', 'Ί': 'I', 29 | 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I', 'Ϋ': 'Y' 30 | }; 31 | const TURKISH_MAP = { 32 | 'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u', 33 | 'Ü': 'U', 'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G' 34 | }; 35 | const ROMANIAN_MAP = { 36 | 'ă': 'a', 'î': 'i', 'ș': 's', 'ț': 't', 'â': 'a', 37 | 'Ă': 'A', 'Î': 'I', 'Ș': 'S', 'Ț': 'T', 'Â': 'A' 38 | }; 39 | const RUSSIAN_MAP = { 40 | 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', 41 | 'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 42 | 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 43 | 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', 44 | 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya', 45 | 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', 46 | 'Ж': 'Zh', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', 47 | 'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', 48 | 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', 49 | 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya' 50 | }; 51 | const UKRAINIAN_MAP = { 52 | 'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i', 53 | 'ї': 'yi', 'ґ': 'g' 54 | }; 55 | const CZECH_MAP = { 56 | 'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', 57 | 'ů': 'u', 'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', 58 | 'Š': 'S', 'Ť': 'T', 'Ů': 'U', 'Ž': 'Z' 59 | }; 60 | const SLOVAK_MAP = { 61 | 'á': 'a', 'ä': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'í': 'i', 'ľ': 'l', 62 | 'ĺ': 'l', 'ň': 'n', 'ó': 'o', 'ô': 'o', 'ŕ': 'r', 'š': 's', 'ť': 't', 63 | 'ú': 'u', 'ý': 'y', 'ž': 'z', 64 | 'Á': 'a', 'Ä': 'A', 'Č': 'C', 'Ď': 'D', 'É': 'E', 'Í': 'I', 'Ľ': 'L', 65 | 'Ĺ': 'L', 'Ň': 'N', 'Ó': 'O', 'Ô': 'O', 'Ŕ': 'R', 'Š': 'S', 'Ť': 'T', 66 | 'Ú': 'U', 'Ý': 'Y', 'Ž': 'Z' 67 | }; 68 | const POLISH_MAP = { 69 | 'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', 70 | 'ź': 'z', 'ż': 'z', 71 | 'Ą': 'A', 'Ć': 'C', 'Ę': 'E', 'Ł': 'L', 'Ń': 'N', 'Ó': 'O', 'Ś': 'S', 72 | 'Ź': 'Z', 'Ż': 'Z' 73 | }; 74 | const LATVIAN_MAP = { 75 | 'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', 76 | 'ņ': 'n', 'š': 's', 'ū': 'u', 'ž': 'z', 77 | 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'I', 'Ķ': 'K', 'Ļ': 'L', 78 | 'Ņ': 'N', 'Š': 'S', 'Ū': 'U', 'Ž': 'Z' 79 | }; 80 | const ARABIC_MAP = { 81 | 'أ': 'a', 'ب': 'b', 'ت': 't', 'ث': 'th', 'ج': 'g', 'ح': 'h', 'خ': 'kh', 'د': 'd', 82 | 'ذ': 'th', 'ر': 'r', 'ز': 'z', 'س': 's', 'ش': 'sh', 'ص': 's', 'ض': 'd', 'ط': 't', 83 | 'ظ': 'th', 'ع': 'aa', 'غ': 'gh', 'ف': 'f', 'ق': 'k', 'ك': 'k', 'ل': 'l', 'م': 'm', 84 | 'ن': 'n', 'ه': 'h', 'و': 'o', 'ي': 'y' 85 | }; 86 | const LITHUANIAN_MAP = { 87 | 'ą': 'a', 'č': 'c', 'ę': 'e', 'ė': 'e', 'į': 'i', 'š': 's', 'ų': 'u', 88 | 'ū': 'u', 'ž': 'z', 89 | 'Ą': 'A', 'Č': 'C', 'Ę': 'E', 'Ė': 'E', 'Į': 'I', 'Š': 'S', 'Ų': 'U', 90 | 'Ū': 'U', 'Ž': 'Z' 91 | }; 92 | const SERBIAN_MAP = { 93 | 'ђ': 'dj', 'ј': 'j', 'љ': 'lj', 'њ': 'nj', 'ћ': 'c', 'џ': 'dz', 94 | 'đ': 'dj', 'Ђ': 'Dj', 'Ј': 'j', 'Љ': 'Lj', 'Њ': 'Nj', 'Ћ': 'C', 95 | 'Џ': 'Dz', 'Đ': 'Dj' 96 | }; 97 | const AZERBAIJANI_MAP = { 98 | 'ç': 'c', 'ə': 'e', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u', 99 | 'Ç': 'C', 'Ə': 'E', 'Ğ': 'G', 'İ': 'I', 'Ö': 'O', 'Ş': 'S', 'Ü': 'U' 100 | }; 101 | const GEORGIAN_MAP = { 102 | 'ა': 'a', 'ბ': 'b', 'გ': 'g', 'დ': 'd', 'ე': 'e', 'ვ': 'v', 'ზ': 'z', 103 | 'თ': 't', 'ი': 'i', 'კ': 'k', 'ლ': 'l', 'მ': 'm', 'ნ': 'n', 'ო': 'o', 104 | 'პ': 'p', 'ჟ': 'j', 'რ': 'r', 'ს': 's', 'ტ': 't', 'უ': 'u', 'ფ': 'f', 105 | 'ქ': 'q', 'ღ': 'g', 'ყ': 'y', 'შ': 'sh', 'ჩ': 'ch', 'ც': 'c', 'ძ': 'dz', 106 | 'წ': 'w', 'ჭ': 'ch', 'ხ': 'x', 'ჯ': 'j', 'ჰ': 'h' 107 | }; 108 | 109 | const ALL_DOWNCODE_MAPS = [ 110 | LATIN_MAP, 111 | LATIN_SYMBOLS_MAP, 112 | GREEK_MAP, 113 | TURKISH_MAP, 114 | ROMANIAN_MAP, 115 | RUSSIAN_MAP, 116 | UKRAINIAN_MAP, 117 | CZECH_MAP, 118 | SLOVAK_MAP, 119 | POLISH_MAP, 120 | LATVIAN_MAP, 121 | ARABIC_MAP, 122 | LITHUANIAN_MAP, 123 | SERBIAN_MAP, 124 | AZERBAIJANI_MAP, 125 | GEORGIAN_MAP 126 | ]; 127 | 128 | const Downcoder = { 129 | 'Initialize': function() { 130 | if (Downcoder.map) { // already made 131 | return; 132 | } 133 | Downcoder.map = {}; 134 | for (const lookup of ALL_DOWNCODE_MAPS) { 135 | Object.assign(Downcoder.map, lookup); 136 | } 137 | Downcoder.regex = new RegExp(Object.keys(Downcoder.map).join('|'), 'g'); 138 | } 139 | }; 140 | 141 | function downcode(slug) { 142 | Downcoder.Initialize(); 143 | return slug.replace(Downcoder.regex, function(m) { 144 | return Downcoder.map[m]; 145 | }); 146 | } 147 | 148 | 149 | function URLify(s, num_chars, allowUnicode) { 150 | // changes, e.g., "Petty theft" to "petty-theft" 151 | if (!allowUnicode) { 152 | s = downcode(s); 153 | } 154 | s = s.toLowerCase(); // convert to lowercase 155 | // if downcode doesn't hit, the char will be stripped here 156 | if (allowUnicode) { 157 | // Keep Unicode letters including both lowercase and uppercase 158 | // characters, whitespace, and dash; remove other characters. 159 | s = XRegExp.replace(s, XRegExp('[^-_\\p{L}\\p{N}\\s]', 'g'), ''); 160 | } else { 161 | s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars 162 | } 163 | s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces 164 | s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens 165 | s = s.substring(0, num_chars); // trim to first num_chars chars 166 | s = s.replace(/-+$/g, ''); // trim any trailing hyphens 167 | return s; 168 | } 169 | window.URLify = URLify; 170 | } 171 | -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/jquery/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright OpenJS Foundation and other contributors, https://openjsf.org/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/af.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ar.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/az.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/bg.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/bn.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/bs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ca.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/cs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/da.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/de.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/dsb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/el.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/en.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/es.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/et.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/eu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/fa.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها می‌توانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/fi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/fr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/gl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/he.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/hi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/hr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/hsb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/hu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/hy.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/id.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/is.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/it.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ja.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ka.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/km.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ko.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/lt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/lv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/mk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ms.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/nb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ne.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/nl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/pl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ps.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/pt-BR.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/pt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ro.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/ru.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/sk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/sl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/sq.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/sr-Cyrl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/sr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/sv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/th.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/tk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/tr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/uk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/vi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/zh-CN.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/select2/i18n/zh-TW.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}(); -------------------------------------------------------------------------------- /static_cdn/admin/js/vendor/xregexp/LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2007-2017 Steven Levithan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /templates/about_page.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block content %} 3 | 4 |
5 |
6 |
7 | 8 | 9 | 10 |

A little bit about me. I am a 23 year old from South Africa.I am new to software development and this is my first tutorial to hopefully help some of you guys wanting to learn too. I hope you enjoy my teaching style and learn a lot from this. I know it's very basic but we have to start somewhere, hopefully sometime soon in the future you'll be learning some pretty cool stuff from me.

11 | 12 |

SAVANNAH

13 |

New Django Developer

14 |
15 |
16 |
17 | ... 22 |
23 |
24 | 25 | {% endblock content %} -------------------------------------------------------------------------------- /templates/all_posts.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 | 5 |
6 |
7 | 8 |
9 |
10 |

11 | All posts

12 |
13 |
14 |
15 | 16 |
17 | {% for post in posts %} 18 |
19 |
20 | content 21 |

22 | {{ post.subtitle }}

23 | 24 | {{ post.title }} 25 |

26 | {{ post.overview }}

27 |
28 |
29 | {% endfor %} 30 | 31 |
32 |
33 |
34 | {% endblock content %} -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 34 | 35 | 36 | 37 | {% include "navbar.html" %} 38 | {% block content %} 39 | {% endblock content %} 40 | {% include "footer.html" %} 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /templates/footer.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 | 6 | 7 | 8 | My Blog 9 | 10 |

© 2022 Tailblocks — 11 | @savgilmour 12 |

13 | 14 | 19 | 24 | 30 | 36 | 37 |
38 |
39 | 40 | -------------------------------------------------------------------------------- /templates/homepage.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 | 5 | 27 | 28 | 29 |
30 |
31 | 34 |

35 | Welcome to
36 | 37 | 38 | MY BLOG 👋 39 | 40 | 43 | 44 |

45 |
46 |
47 |
48 |
49 |
50 | {% for category in categories %} 51 |
52 |
53 |
54 |

55 | CATEGORY

56 |

57 | {{ category.title }}

58 |

59 | {{ category.subtitle }}

60 | 61 | Posts 62 | 63 | 64 | 65 | 66 | 67 | 68 |
69 |
70 | 71 |
72 | {% endfor %} 73 |
74 |
75 |
76 | 77 | 82 |
83 |
84 |
85 |

86 | Recent Posts

87 |

88 | These are the most recently added posts

89 |
90 |
91 | {% for obj in object_list %} 92 |
93 |
95 |
96 | 97 |
98 | 99 |
100 |
101 |
102 |
103 | {% for category in obj.categories.all %} 104 |
105 | {{ category.title }} 106 |
107 | {% endfor %} 108 |
109 |
110 | {{ obj.title }} 111 |
112 | 113 |
114 | {{ obj.overview }} 115 |
116 | 117 | 122 | 123 |
124 |
125 | {% endfor %} 126 |
127 |
128 |
129 | {% endblock content %} -------------------------------------------------------------------------------- /templates/navbar.html: -------------------------------------------------------------------------------- 1 | {% load markdown_extras %} 2 | 3 | {% get_categories as category_list %} 4 | 5 |
6 |
7 | 8 | 9 | 10 | 11 | 12 | My blog 13 | 14 | 56 | 57 |
58 |
59 | 61 | 70 |
71 |
72 |
73 | 74 | 75 |
-------------------------------------------------------------------------------- /templates/post.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load markdown_extras %} 3 | {% block content %} 4 | 5 | 6 | 7 | 43 | 44 | 45 |
46 | 47 |
48 | 49 | 50 |
51 |

52 | {{ post.title }}

53 |

54 | {{ obj.timestamp}}

55 | content 56 |
57 | 58 | 59 | 60 | 61 |
62 | {{ post.content | markdown | safe }} 63 |
64 | 65 | 66 | 67 | 68 | 69 | 70 |
    71 |
  1. Maecenas accumsan lacus sit amet elementum porta. Aliquam eu libero lectus. Fusce vehicula dictum mi. In non dolor at sem ullamcorper venenatis ut sed dui. Ut ut est quam. Suspendisse quam quam, commodo sit amet placerat in, interdum a ipsum. Morbi sit amet tellus scelerisque tortor semper posuere.
  2. 72 |
  3. Morbi varius posuere blandit. Praesent gravida bibendum neque eget commodo. Duis auctor ornare mauris, eu accumsan odio viverra in. Proin sagittis maximus pharetra. Nullam lorem mauris, faucibus ut odio tempus, ultrices aliquet ex. Nam id quam eget ipsum luctus hendrerit. Ut eros magna, eleifend ac ornare vulputate, pretium nec felis.
  4. 73 |
  5. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc vitae pretium elit. Cras leo mauris, tristique in risus ac, tristique rutrum velit. Mauris accumsan tempor felis vitae gravida. Cras egestas convallis malesuada. Etiam ac ante id tortor vulputate pretium. Maecenas vel sapien suscipit, elementum odio et, consequat tellus.
  6. 74 |
75 | 76 | 77 | 78 | 79 | 80 | 81 |
82 | 83 | 84 | 85 | 86 |
87 | 88 | 89 | 90 | 91 |
92 | 93 |
94 |

95 | {{ post.author }}

96 | 97 |
98 | 99 |
100 | 101 | 102 | 103 |
104 | 105 | 106 | 107 |
108 | 109 | 110 | 111 | 112 | 155 | 156 | 157 | 158 | {% endblock content %} 159 | -------------------------------------------------------------------------------- /templates/post_list.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 | 5 |
6 |
7 |
8 |
9 |

10 | {{ category.title }}

11 |
12 |
13 |
14 |
15 | {% for post in posts %} 16 |
17 |
18 | content 19 |

20 | {{ post.subtitle }}

21 | 22 | {{ post.title }} 23 |

24 | {{ post.overview }}

25 |
26 |
27 | {% endfor %} 28 | 29 |
30 |
31 |
32 | {% endblock content %} -------------------------------------------------------------------------------- /templates/search_bar.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% block content %} 3 | 4 | 5 |
6 |
7 |
8 |

9 | Search Results

10 | 11 |
12 |
13 | {% for obj in object_list %} 14 |
15 |
16 | 17 |
18 | 19 |
20 |
21 |
22 |
23 | {% for category in obj.categories.all %} 24 |
25 | {{ category.title }} 26 |
27 | {% endfor %} 28 |
29 |
30 | {{ obj.title }} 31 |
32 | 33 |
34 | {{ obj.overview }} 35 |
36 | 37 | 42 | 43 |
44 |
45 | {% endfor %} 46 |
47 |
48 |
49 | 50 | 51 | {% endblock %} --------------------------------------------------------------------------------