├── .attachments └── readme_db_diagram.png ├── .gitignore ├── .reuse └── dep5 ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSES ├── MIT.txt └── OFL-1.1.txt ├── README.md ├── apps ├── daggerboard_ui │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── ldap.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── package.json │ ├── packages │ │ └── send_smtp_mail │ │ │ ├── __init__.py │ │ │ └── email_user.py │ ├── rbac.py │ ├── static │ │ ├── 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 │ │ │ │ ├── actions.min.js │ │ │ │ ├── admin │ │ │ │ ├── DateTimeShortcuts.js │ │ │ │ └── RelatedObjectLookups.js │ │ │ │ ├── autocomplete.js │ │ │ │ ├── calendar.js │ │ │ │ ├── cancel.js │ │ │ │ ├── change_form.js │ │ │ │ ├── collapse.js │ │ │ │ ├── collapse.min.js │ │ │ │ ├── core.js │ │ │ │ ├── inlines.js │ │ │ │ ├── inlines.min.js │ │ │ │ ├── jquery.init.js │ │ │ │ ├── nav_sidebar.js │ │ │ │ ├── popup_response.js │ │ │ │ ├── prepopulate.js │ │ │ │ ├── prepopulate.min.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 │ │ ├── css │ │ │ ├── jquery.dataTables.css │ │ │ ├── jquery.dataTables.min.css │ │ │ └── slimselect.css │ │ ├── daggerboard.css │ │ ├── daggerboard.css.map │ │ ├── daggerboard.scss │ │ ├── fonts │ │ │ ├── BebasNeue-Regular.ttf │ │ │ ├── SourceSansPro-Bold.ttf │ │ │ ├── SourceSansPro-ExtraLight.ttf │ │ │ ├── SourceSansPro-Light.ttf │ │ │ └── SourceSansPro-Regular.ttf │ │ ├── images │ │ │ ├── daggerboard_icon.png │ │ │ ├── daggerboard_icon_2.svg │ │ │ ├── favicon.ico │ │ │ ├── ship_logo.ico │ │ │ ├── sort_asc.png │ │ │ ├── sort_asc_disabled.png │ │ │ ├── sort_both.png │ │ │ ├── sort_desc.png │ │ │ └── sort_desc_disabled.png │ │ ├── js │ │ │ ├── Chart.bundle.js │ │ │ ├── bootstrap-select.js │ │ │ ├── bootstrap-select.js.map │ │ │ ├── bootstrap-select.min.js │ │ │ ├── bootstrap-select.min.js.map │ │ │ ├── bootstrap.bundle.js │ │ │ ├── bootstrap.bundle.min.js.map │ │ │ ├── chart.js │ │ │ ├── dashboard.js │ │ │ ├── jquery.dataTables.js │ │ │ ├── jquery.dataTables.min.js │ │ │ ├── jquery.js │ │ │ ├── jquery.min.js │ │ │ ├── sbomscorecard.js │ │ │ ├── slimselect.js │ │ │ ├── tab.js │ │ │ ├── upload_status.js │ │ │ └── vendorscorecard.js │ │ └── scss │ │ │ └── bootstrap │ │ │ └── scss │ │ │ ├── _accordion.scss │ │ │ ├── _alert.scss │ │ │ ├── _badge.scss │ │ │ ├── _breadcrumb.scss │ │ │ ├── _button-group.scss │ │ │ ├── _buttons.scss │ │ │ ├── _card.scss │ │ │ ├── _carousel.scss │ │ │ ├── _close.scss │ │ │ ├── _containers.scss │ │ │ ├── _dropdown.scss │ │ │ ├── _forms.scss │ │ │ ├── _functions.scss │ │ │ ├── _grid.scss │ │ │ ├── _helpers.scss │ │ │ ├── _images.scss │ │ │ ├── _list-group.scss │ │ │ ├── _mixins.scss │ │ │ ├── _modal.scss │ │ │ ├── _nav.scss │ │ │ ├── _navbar.scss │ │ │ ├── _offcanvas.scss │ │ │ ├── _pagination.scss │ │ │ ├── _placeholders.scss │ │ │ ├── _popover.scss │ │ │ ├── _progress.scss │ │ │ ├── _reboot.scss │ │ │ ├── _root.scss │ │ │ ├── _spinners.scss │ │ │ ├── _tables.scss │ │ │ ├── _toasts.scss │ │ │ ├── _tooltip.scss │ │ │ ├── _transitions.scss │ │ │ ├── _type.scss │ │ │ ├── _utilities.scss │ │ │ ├── _variables.scss │ │ │ ├── bootstrap-grid.scss │ │ │ ├── bootstrap-reboot.scss │ │ │ ├── bootstrap-utilities.scss │ │ │ ├── bootstrap.scss │ │ │ ├── forms │ │ │ ├── _floating-labels.scss │ │ │ ├── _form-check.scss │ │ │ ├── _form-control.scss │ │ │ ├── _form-range.scss │ │ │ ├── _form-select.scss │ │ │ ├── _form-text.scss │ │ │ ├── _input-group.scss │ │ │ ├── _labels.scss │ │ │ └── _validation.scss │ │ │ ├── helpers │ │ │ ├── _clearfix.scss │ │ │ ├── _colored-links.scss │ │ │ ├── _position.scss │ │ │ ├── _ratio.scss │ │ │ ├── _stacks.scss │ │ │ ├── _stretched-link.scss │ │ │ ├── _text-truncation.scss │ │ │ ├── _visually-hidden.scss │ │ │ └── _vr.scss │ │ │ ├── mixins │ │ │ ├── _alert.scss │ │ │ ├── _backdrop.scss │ │ │ ├── _border-radius.scss │ │ │ ├── _box-shadow.scss │ │ │ ├── _breakpoints.scss │ │ │ ├── _buttons.scss │ │ │ ├── _caret.scss │ │ │ ├── _clearfix.scss │ │ │ ├── _color-scheme.scss │ │ │ ├── _container.scss │ │ │ ├── _deprecate.scss │ │ │ ├── _forms.scss │ │ │ ├── _gradients.scss │ │ │ ├── _grid.scss │ │ │ ├── _image.scss │ │ │ ├── _list-group.scss │ │ │ ├── _lists.scss │ │ │ ├── _pagination.scss │ │ │ ├── _reset-text.scss │ │ │ ├── _resize.scss │ │ │ ├── _table-variants.scss │ │ │ ├── _text-truncate.scss │ │ │ ├── _transition.scss │ │ │ ├── _utilities.scss │ │ │ └── _visually-hidden.scss │ │ │ ├── utilities │ │ │ └── _api.scss │ │ │ └── vendor │ │ │ └── _rfs.scss │ ├── tasks.py │ ├── templates │ │ ├── admin │ │ │ ├── base.html │ │ │ ├── base_site.html │ │ │ └── grading │ │ │ │ └── gradethresholds │ │ │ │ └── change_form.html │ │ ├── base.html │ │ ├── head.html │ │ ├── home.html │ │ ├── login.html │ │ ├── navbar.html │ │ ├── not-found-page.html │ │ ├── sbomscorecard.html │ │ └── vendorscorecard.html │ ├── templatetags │ │ └── daggerboard_templatetags.py │ ├── tests.py │ └── views.py ├── grading │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py └── sbomscanner │ ├── __init__.py │ ├── apps.py │ ├── archive_spdx │ ├── SPDX-ACME-INFUSION-1-0-SBOM-DRAFT-26-1-2022-12-2.spdx.Vyfv │ ├── SPDX-ACME-INFUSION-1-0-SBOM-DRAFT-26-1-2022-12-2.spdx.gmNU │ ├── sbomdemo2_product1.spdx.xlmO │ ├── vulnerable.spdx.SUKU │ ├── vulnerable.spdx.bQXf │ └── vulnerable.spdx.swcL │ ├── cyclonedxtospdx │ ├── exploitdb_lookup │ ├── get_cve_cpe.py │ ├── get_nvd_data_feed │ ├── get_nvd_data_feed_daily │ ├── jsontospdx.py │ ├── migrations │ ├── 0001_initial.py │ └── __init__.py │ ├── models.py │ ├── nvd.html │ ├── packages │ ├── cyclonedx_to_spdx │ │ └── __init__.py │ ├── database_updater │ │ └── __init__.py │ ├── exploitdb_lookup │ │ └── __init__.py │ ├── file_hasher │ │ └── __init__.py │ ├── json_to_spdx │ │ └── __init__.py │ ├── nvd_scraper │ │ └── __init__.py │ ├── scorecard │ │ └── __init__.py │ ├── spdx_extractor │ │ └── __init__.py │ └── tag_validator │ │ └── __init__.py │ ├── process_cpedict.py │ ├── process_cvecpe.py │ ├── proxystatus │ ├── reset_nvd_db │ ├── sbom_process.py │ ├── serializers.py │ ├── tasks.py │ ├── tests │ ├── conftest.py │ ├── sbom_samples │ │ ├── apache.spdx │ │ └── vulnerable.spdx │ └── test_sbomscanner.py │ └── views.py ├── contributing └── bug_template.md ├── daggerboardproject ├── __init__.py ├── asgi.py ├── settings │ ├── __init__.py │ ├── base.py │ ├── celery.py │ ├── development.py │ ├── production.py │ └── test.py ├── urls.py └── wsgi.py ├── docs └── daggerboard_api_guide.md ├── install.log ├── install_daggerboard.sh ├── manage.py ├── meta ├── .reuse │ └── dep5 ├── SPDX-DAGGERBOARD-1-0-SBOM-20-5-2022-23-40.spdx └── reuse.spdx ├── requirements.txt └── utils ├── migrations_check.sh └── reset_nvd_db.py /.attachments/readme_db_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/.attachments/readme_db_diagram.png -------------------------------------------------------------------------------- /.reuse/dep5: -------------------------------------------------------------------------------- 1 | Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Upstream-Name: 3 | Upstream-Contact: 4 | Source: 5 | 6 | Files: daggerboard/static/js/bootstrap/* daggerboard/static/scss/bootstrap/* daggerboard/static/js/bootstrap* daggerboard/static/js/tab.js daggerboard/static/CACHE/css/bootstrap* 7 | Copyright: 2011-2022 Twitter, Inc. 8 | Copyright: 2011-2022 The Bootstrap Authors 9 | License: MIT 10 | 11 | 12 | Files: daggerboard/static/admin/* 13 | Copyright: 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors 14 | License: MIT 15 | 16 | Files: daggerboard/static/js/chart.js daggerboard/static/js/Chart.bundle.js 17 | Copyright: 2014-2022 Chart.js Contributors 18 | License: MIT 19 | 20 | Files: daggerboard/static/js/jquery* daggerboard/static/css/jquery* 21 | Copyright: 2022 OpenJS Foundation and jQuery contributors 22 | License: MIT 23 | 24 | Files: daggerboard/static/css/slimselect.css daggerboard/static/js/slimselect.js 25 | Copyright: 2017 Brian Voelker 26 | License: MIT 27 | 28 | Files: daggerboard/static/images/* .attachments/readme_db_diagram.png daggerboard/static/daggerboard* daggerboardproject/.env daggerboard/templates/* 29 | Copyright: 2022 NewYork-Presbyterian Hospital 30 | License: MIT 31 | 32 | Files: daggerboard/static/fonts/BebasNeue-Regular.ttf 33 | Copyright: 2010 by Dharma Type 34 | License: OFL-1.1 35 | 36 | Files: daggerboard/static/fonts/SourceSansPro* daggerboard/static/fonts/OFL.txt 37 | Copyright: 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’ 38 | License: OFL-1.1 -------------------------------------------------------------------------------- /LICENSES/MIT.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2022 NewYork-Presbyterian Hospital 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /apps/daggerboard_ui/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/__init__.py -------------------------------------------------------------------------------- /apps/daggerboard_ui/admin.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from django.contrib import admin 6 | 7 | from .models import Cpe, Cve, Ldap, Package, Sbom 8 | 9 | 10 | @admin.register(Sbom) 11 | class SBOMAdmin(admin.ModelAdmin): 12 | list_display = ["documentname", "vendorname", "uploadtime"] 13 | list_filter = ("uploadtime", "documentname", "vendorname") 14 | search_fields = ["documentname", "vendorname"] 15 | 16 | 17 | @admin.register(Package) 18 | class PackageAdmin(admin.ModelAdmin): 19 | list_display = ["packagename", "packageversion", "sbomid_packages"] 20 | list_filter = ["packagename"] 21 | search_fields = ["packagename"] 22 | 23 | 24 | @admin.register(Cpe) 25 | class CPEAdmin(admin.ModelAdmin): 26 | list_display = ["cpe", "sbomid_cpe", "packageid_cpe"] 27 | list_filter = ["sbomid_cpe"] 28 | search_fields = ["cpe"] 29 | 30 | 31 | @admin.register(Cve) 32 | class CVEAdmin(admin.ModelAdmin): 33 | list_display = ["cve", "sbomid_cve", "packageid_cve"] 34 | list_filter = ["cve", "cvss3_severity"] 35 | search_fields = ["cve"] 36 | 37 | 38 | @admin.register(Ldap) 39 | class LDAPAdmin(admin.ModelAdmin): 40 | list_display = [ 41 | "server_uri", 42 | "bind_dn", 43 | "bind_password", 44 | "user_search", 45 | "group_search", 46 | "auth_ldap_group_type", 47 | "auth_ldap_require_group", 48 | ] 49 | 50 | # restrict to one LDAP entry 51 | def has_add_permission(self, request): 52 | return ( 53 | False 54 | if self.model.objects.count() > 0 55 | else super().has_add_permission(request) 56 | ) 57 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/apps.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from django.apps import AppConfig 6 | 7 | 8 | class DaggerboardConfig(AppConfig): 9 | default_auto_field = "django.db.models.BigAutoField" 10 | name = "apps.daggerboard_ui" 11 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/forms.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from django import forms 6 | from django.forms import ModelForm 7 | 8 | from .models import Sbom, SbomUpload 9 | 10 | 11 | class vendorPickerform(ModelForm): 12 | """ 13 | Form to populate vendor data on the vendor scorecard. 14 | """ 15 | 16 | class Meta: 17 | model = Sbom 18 | fields = [ 19 | "id", 20 | ] 21 | 22 | 23 | class SbomForm(forms.ModelForm): 24 | """ 25 | Form used for uploading SBOMs for analysis. 26 | """ 27 | 28 | class Meta: 29 | model = SbomUpload 30 | fields = (("sbomfile"),) 31 | widgets = {"sbomfile": forms.ClearableFileInput(attrs={"multiple": False})} 32 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/migrations/__init__.py -------------------------------------------------------------------------------- /apps/daggerboard_ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daggerboard", 3 | "version": "1.0.0", 4 | "description": "Web libraries for daggerboard", 5 | "main": "index.js", 6 | "dependencies": { 7 | "bootstrap": "^5.0.2" 8 | }, 9 | "devDependencies": {}, 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1" 12 | }, 13 | "author": "", 14 | "license": "ISC" 15 | } 16 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/packages/send_smtp_mail/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/packages/send_smtp_mail/__init__.py -------------------------------------------------------------------------------- /apps/daggerboard_ui/rbac.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | 6 | def is_ro(user): 7 | return user.groups.filter(name="Daggerboard_Read").exists() 8 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | .login { 4 | background: #f8f8f8; 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 | } 17 | 18 | .login #header h1 a { 19 | color: #fff; 20 | } 21 | 22 | .login #content { 23 | padding: 20px 20px 0; 24 | } 25 | 26 | .login #container { 27 | background: #fff; 28 | border: 1px solid #eaeaea; 29 | border-radius: 4px; 30 | overflow: hidden; 31 | width: 28em; 32 | min-width: 300px; 33 | margin: 100px auto; 34 | height: auto; 35 | } 36 | 37 | .login #content-main { 38 | width: 100%; 39 | } 40 | 41 | .login .form-row { 42 | padding: 4px 0; 43 | float: left; 44 | width: 100%; 45 | border-bottom: none; 46 | } 47 | 48 | .login .form-row label { 49 | padding-right: 0.5em; 50 | line-height: 2em; 51 | font-size: 1em; 52 | clear: both; 53 | color: #333; 54 | } 55 | 56 | .login .form-row #id_username, .login .form-row #id_password { 57 | clear: both; 58 | padding: 8px; 59 | width: 100%; 60 | box-sizing: border-box; 61 | } 62 | 63 | .login span.help { 64 | font-size: 10px; 65 | display: block; 66 | } 67 | 68 | .login .submit-row { 69 | clear: both; 70 | padding: 1em 0 0 9.4em; 71 | margin: 0; 72 | border: none; 73 | background: none; 74 | text-align: left; 75 | } 76 | 77 | .login .password-reset-link { 78 | text-align: center; 79 | } 80 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-viewlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/js/autocomplete.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | { 3 | const $ = django.jQuery; 4 | const init = function($element, options) { 5 | const settings = $.extend({ 6 | ajax: { 7 | data: function(params) { 8 | return { 9 | term: params.term, 10 | page: params.page 11 | }; 12 | } 13 | } 14 | }, options); 15 | $element.select2(settings); 16 | }; 17 | 18 | $.fn.djangoAdminSelect2 = function(options) { 19 | const settings = $.extend({}, options); 20 | $.each(this, function(i, element) { 21 | const $element = $(element); 22 | init($element, settings); 23 | }); 24 | return this; 25 | }; 26 | 27 | $(function() { 28 | // Initialize all autocomplete widgets except the one in the template 29 | // form used when a new formset is added. 30 | $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); 31 | }); 32 | 33 | $(document).on('formset:added', (function() { 34 | return function(event, $newFormset) { 35 | return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); 36 | }; 37 | })(this)); 38 | } 39 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | if (window.location.search.indexOf('&_popup=1') === -1) { 18 | window.history.back(); // Go back if not a popup. 19 | } else { 20 | window.close(); // Otherwise, close the popup. 21 | } 22 | } 23 | 24 | document.querySelectorAll('.cancel-link').forEach(function(el) { 25 | el.addEventListener('click', handleClick); 26 | }); 27 | }); 28 | } 29 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/js/collapse.min.js: -------------------------------------------------------------------------------- 1 | 'use strict';window.addEventListener("load",function(){var c=document.querySelectorAll("fieldset.collapse");for(const [a,b]of c.entries())if(0===b.querySelectorAll("div.errors, ul.errorlist").length){b.classList.add("collapsed");c=b.querySelector("h2");const d=document.createElement("a");d.id="fieldsetcollapser"+a;d.className="collapse-toggle";d.href="#";d.textContent=gettext("Show");c.appendChild(document.createTextNode(" ("));c.appendChild(d);c.appendChild(document.createTextNode(")"))}const e= 2 | function(a){if(a.target.matches(".collapse-toggle")){a.preventDefault();a.stopPropagation();const b=a.target.closest("fieldset");b.classList.contains("collapsed")?(a.target.textContent=gettext("Hide"),b.classList.remove("collapsed")):(a.target.textContent=gettext("Show"),b.classList.add("collapsed"))}};document.querySelectorAll("fieldset.module").forEach(function(a){a.addEventListener("click",e)})}); 3 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/admin/js/prepopulate.min.js: -------------------------------------------------------------------------------- 1 | 'use strict';{const b=django.jQuery;b.fn.prepopulate=function(d,f,g){return this.each(function(){const a=b(this),h=function(){if(!a.data("_changed")){var e=[];b.each(d,function(a,c){c=b(c);01&&(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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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}(); -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/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 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/daggerboard.css: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 3 | * 4 | * SPDX-License-Identifier: MIT 5 | */ 6 | 7 | /* fonts */ 8 | @import url("https://fonts.googleapis.com/css2?family=Open+Sans:wght@300&family=Roboto+Condensed:wght@300&display=swap"); 9 | @import url("https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Source+Sans+Pro:wght@200;300;400;600;700&display=swap"); 10 | @import "./CACHE/css/bootstrap.ef16b29e00e4.css"; 11 | body { 12 | color: #5B5555; 13 | background-color: #F4F5F6; 14 | font-family: "Source Sans Pro", sans-serif; 15 | text-transform: uppercase; 16 | font-weight: 500; 17 | } 18 | @media (min-width: 64em) { 19 | body { 20 | font-size: 14.4px; 21 | } 22 | } 23 | @media (min-width: 85.375em) { 24 | body { 25 | font-size: 15.6px; 26 | } 27 | } 28 | @media (min-width: 120em) { 29 | body { 30 | font-size: 7.2px; 31 | } 32 | } 33 | @media (min-width: 160em) { 34 | body { 35 | font-size: 6px; 36 | } 37 | } 38 | 39 | h5 { 40 | font-size: 1.55rem; 41 | } 42 | 43 | .banner { 44 | background-image: linear-gradient(to top, #b3d9ef 0%, #5ab6ec 100%); 45 | background-size: cover; 46 | width: 100%; 47 | background-repeat: no-repeat; 48 | border: transparent; 49 | } 50 | @media (min-width: 64em) { 51 | .banner { 52 | padding: 0.5rem 4rem; 53 | } 54 | } 55 | @media (min-width: 85.375em) { 56 | .banner { 57 | padding: 0.5rem 4rem; 58 | } 59 | } 60 | @media (min-width: 120em) { 61 | .banner { 62 | padding: 0.5rem 4rem; 63 | } 64 | } 65 | @media (min-width: 160em) { 66 | .banner { 67 | padding: 0.5rem 4rem; 68 | } 69 | } 70 | 71 | .desktop-header { 72 | background-color: #323541; 73 | padding-top: 1rem; 74 | padding-bottom: 1rem; 75 | color: white !important; 76 | } 77 | 78 | .desktop-header h1 { 79 | font-size: 40px !important; 80 | font-family: "Source Sans Pro", sans-serif !important; 81 | font-weight: 200; 82 | text-transform: none; 83 | } 84 | 85 | .desktop-header h2 { 86 | font-size: 18px !important; 87 | font-weight: 300; 88 | color: #a2a1a1; 89 | } 90 | 91 | .nav-item.active { 92 | text-decoration: underline; 93 | } 94 | 95 | .sbom-btn { 96 | background-color: #6A8085; 97 | color: white; 98 | } 99 | 100 | 101 | 102 | /*# sourceMappingURL=daggerboard.css.map */ 103 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/daggerboard.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["daggerboard.scss"],"names":[],"mappings":"AAAA;AACQ;AAEA;AACA;AAyBR;EACE;EACA;EACA,aANa;EAOb;EACA;;AAEA;EAPF;IAQI;;;AAGF;EAXF;IAYI;;;AAGF;EAfF;IAgBI;;;AAGF;EAnBF;IAoBI;;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EAPF;IAQI;;;AAEF;EAVF;IAWI;;;AAEF;EAbF;IAcI;;;AAEF;EAhBF;IAiBI;;;;AAKJ;EACE;EACA;EACA;EACA;;;AAGF;EACI;EACA;EACA;EACF;;;AAEF;EACE;EACA;EACA;;;AAGF;EACA;;;AAIA;EACE;EACA","file":"daggerboard.css"} -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/fonts/BebasNeue-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/fonts/BebasNeue-Regular.ttf -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/fonts/SourceSansPro-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/fonts/SourceSansPro-Bold.ttf -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/fonts/SourceSansPro-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/fonts/SourceSansPro-ExtraLight.ttf -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/fonts/SourceSansPro-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/fonts/SourceSansPro-Light.ttf -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/fonts/SourceSansPro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/fonts/SourceSansPro-Regular.ttf -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/images/daggerboard_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/images/daggerboard_icon.png -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/images/daggerboard_icon_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/images/favicon.ico -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/images/ship_logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/images/ship_logo.ico -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/images/sort_asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/images/sort_asc.png -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/images/sort_asc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/images/sort_asc_disabled.png -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/images/sort_both.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/images/sort_both.png -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/images/sort_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/images/sort_desc.png -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/images/sort_desc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/daggerboard_ui/static/images/sort_desc_disabled.png -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_alert.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Base styles 3 | // 4 | 5 | .alert { 6 | position: relative; 7 | padding: $alert-padding-y $alert-padding-x; 8 | margin-bottom: $alert-margin-bottom; 9 | border: $alert-border-width solid transparent; 10 | @include border-radius($alert-border-radius); 11 | } 12 | 13 | // Headings for larger alerts 14 | .alert-heading { 15 | // Specified to prevent conflicts of changing $headings-color 16 | color: inherit; 17 | } 18 | 19 | // Provide class for links that match alerts 20 | .alert-link { 21 | font-weight: $alert-link-font-weight; 22 | } 23 | 24 | 25 | // Dismissible alerts 26 | // 27 | // Expand the right padding and account for the close button's positioning. 28 | 29 | .alert-dismissible { 30 | padding-right: $alert-dismissible-padding-r; 31 | 32 | // Adjust close link position 33 | .btn-close { 34 | position: absolute; 35 | top: 0; 36 | right: 0; 37 | z-index: $stretched-link-z-index + 1; 38 | padding: $alert-padding-y * 1.25 $alert-padding-x; 39 | } 40 | } 41 | 42 | 43 | // scss-docs-start alert-modifiers 44 | // Generate contextual modifier classes for colorizing the alert. 45 | 46 | @each $state, $value in $theme-colors { 47 | $alert-background: shift-color($value, $alert-bg-scale); 48 | $alert-border: shift-color($value, $alert-border-scale); 49 | $alert-color: shift-color($value, $alert-color-scale); 50 | @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) { 51 | $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale)); 52 | } 53 | .alert-#{$state} { 54 | @include alert-variant($alert-background, $alert-border, $alert-color); 55 | } 56 | } 57 | // scss-docs-end alert-modifiers 58 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_badge.scss: -------------------------------------------------------------------------------- 1 | // Base class 2 | // 3 | // Requires one of the contextual, color modifier classes for `color` and 4 | // `background-color`. 5 | 6 | .badge { 7 | display: inline-block; 8 | padding: $badge-padding-y $badge-padding-x; 9 | @include font-size($badge-font-size); 10 | font-weight: $badge-font-weight; 11 | line-height: 1; 12 | color: $badge-color; 13 | text-align: center; 14 | white-space: nowrap; 15 | vertical-align: baseline; 16 | @include border-radius($badge-border-radius); 17 | @include gradient-bg(); 18 | 19 | // Empty badges collapse automatically 20 | &:empty { 21 | display: none; 22 | } 23 | } 24 | 25 | // Quick fix for badges in buttons 26 | .btn .badge { 27 | position: relative; 28 | top: -1px; 29 | } 30 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | .breadcrumb { 2 | display: flex; 3 | flex-wrap: wrap; 4 | padding: $breadcrumb-padding-y $breadcrumb-padding-x; 5 | margin-bottom: $breadcrumb-margin-bottom; 6 | @include font-size($breadcrumb-font-size); 7 | list-style: none; 8 | background-color: $breadcrumb-bg; 9 | @include border-radius($breadcrumb-border-radius); 10 | } 11 | 12 | .breadcrumb-item { 13 | // The separator between breadcrumbs (by default, a forward-slash: "/") 14 | + .breadcrumb-item { 15 | padding-left: $breadcrumb-item-padding-x; 16 | 17 | &::before { 18 | float: left; // Suppress inline spacings and underlining of the separator 19 | padding-right: $breadcrumb-item-padding-x; 20 | color: $breadcrumb-divider-color; 21 | content: var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"}; 22 | } 23 | } 24 | 25 | &.active { 26 | color: $breadcrumb-active-color; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_close.scss: -------------------------------------------------------------------------------- 1 | // transparent background and border properties included for button version. 2 | // iOS requires the button element instead of an anchor tag. 3 | // If you want the anchor version, it requires `href="#"`. 4 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile 5 | 6 | .btn-close { 7 | box-sizing: content-box; 8 | width: $btn-close-width; 9 | height: $btn-close-height; 10 | padding: $btn-close-padding-y $btn-close-padding-x; 11 | color: $btn-close-color; 12 | background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements 13 | border: 0; // for button elements 14 | @include border-radius(); 15 | opacity: $btn-close-opacity; 16 | 17 | // Override 's hover style 18 | &:hover { 19 | color: $btn-close-color; 20 | text-decoration: none; 21 | opacity: $btn-close-hover-opacity; 22 | } 23 | 24 | &:focus { 25 | outline: 0; 26 | box-shadow: $btn-close-focus-shadow; 27 | opacity: $btn-close-focus-opacity; 28 | } 29 | 30 | &:disabled, 31 | &.disabled { 32 | pointer-events: none; 33 | user-select: none; 34 | opacity: $btn-close-disabled-opacity; 35 | } 36 | } 37 | 38 | .btn-close-white { 39 | filter: $btn-close-white-filter; 40 | } 41 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_containers.scss: -------------------------------------------------------------------------------- 1 | // Container widths 2 | // 3 | // Set the container width, and override it for fixed navbars in media queries. 4 | 5 | @if $enable-grid-classes { 6 | // Single container class with breakpoint max-widths 7 | .container, 8 | // 100% wide container at all breakpoints 9 | .container-fluid { 10 | @include make-container(); 11 | } 12 | 13 | // Responsive containers that are 100% wide until a breakpoint 14 | @each $breakpoint, $container-max-width in $container-max-widths { 15 | .container-#{$breakpoint} { 16 | @extend .container-fluid; 17 | } 18 | 19 | @include media-breakpoint-up($breakpoint, $grid-breakpoints) { 20 | %responsive-container-#{$breakpoint} { 21 | max-width: $container-max-width; 22 | } 23 | 24 | // Extend each breakpoint which is smaller or equal to the current breakpoint 25 | $extend-breakpoint: true; 26 | 27 | @each $name, $width in $grid-breakpoints { 28 | @if ($extend-breakpoint) { 29 | .container#{breakpoint-infix($name, $grid-breakpoints)} { 30 | @extend %responsive-container-#{$breakpoint}; 31 | } 32 | 33 | // Once the current breakpoint is reached, stop extending 34 | @if ($breakpoint == $name) { 35 | $extend-breakpoint: false; 36 | } 37 | } 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_forms.scss: -------------------------------------------------------------------------------- 1 | @import "forms/labels"; 2 | @import "forms/form-text"; 3 | @import "forms/form-control"; 4 | @import "forms/form-select"; 5 | @import "forms/form-check"; 6 | @import "forms/form-range"; 7 | @import "forms/floating-labels"; 8 | @import "forms/input-group"; 9 | @import "forms/validation"; 10 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_grid.scss: -------------------------------------------------------------------------------- 1 | // Row 2 | // 3 | // Rows contain your columns. 4 | 5 | @if $enable-grid-classes { 6 | .row { 7 | @include make-row(); 8 | 9 | > * { 10 | @include make-col-ready(); 11 | } 12 | } 13 | } 14 | 15 | @if $enable-cssgrid { 16 | .grid { 17 | display: grid; 18 | grid-template-rows: repeat(var(--#{$variable-prefix}rows, 1), 1fr); 19 | grid-template-columns: repeat(var(--#{$variable-prefix}columns, #{$grid-columns}), 1fr); 20 | gap: var(--#{$variable-prefix}gap, #{$grid-gutter-width}); 21 | 22 | @include make-cssgrid(); 23 | } 24 | } 25 | 26 | 27 | // Columns 28 | // 29 | // Common styles for small and large grid columns 30 | 31 | @if $enable-grid-classes { 32 | @include make-grid-columns(); 33 | } 34 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_helpers.scss: -------------------------------------------------------------------------------- 1 | @import "helpers/clearfix"; 2 | @import "helpers/colored-links"; 3 | @import "helpers/ratio"; 4 | @import "helpers/position"; 5 | @import "helpers/stacks"; 6 | @import "helpers/visually-hidden"; 7 | @import "helpers/stretched-link"; 8 | @import "helpers/text-truncation"; 9 | @import "helpers/vr"; 10 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_images.scss: -------------------------------------------------------------------------------- 1 | // Responsive images (ensure images don't scale beyond their parents) 2 | // 3 | // This is purposefully opt-in via an explicit class rather than being the default for all ``s. 4 | // We previously tried the "images are responsive by default" approach in Bootstrap v2, 5 | // and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps) 6 | // which weren't expecting the images within themselves to be involuntarily resized. 7 | // See also https://github.com/twbs/bootstrap/issues/18178 8 | .img-fluid { 9 | @include img-fluid(); 10 | } 11 | 12 | 13 | // Image thumbnails 14 | .img-thumbnail { 15 | padding: $thumbnail-padding; 16 | background-color: $thumbnail-bg; 17 | border: $thumbnail-border-width solid $thumbnail-border-color; 18 | @include border-radius($thumbnail-border-radius); 19 | @include box-shadow($thumbnail-box-shadow); 20 | 21 | // Keep them at most 100% wide 22 | @include img-fluid(); 23 | } 24 | 25 | // 26 | // Figures 27 | // 28 | 29 | .figure { 30 | // Ensures the caption's text aligns with the image. 31 | display: inline-block; 32 | } 33 | 34 | .figure-img { 35 | margin-bottom: $spacer * .5; 36 | line-height: 1; 37 | } 38 | 39 | .figure-caption { 40 | @include font-size($figure-caption-font-size); 41 | color: $figure-caption-color; 42 | } 43 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Toggles 2 | // 3 | // Used in conjunction with global variables to enable certain theme features. 4 | 5 | // Vendor 6 | @import "vendor/rfs"; 7 | 8 | // Deprecate 9 | @import "mixins/deprecate"; 10 | 11 | // Helpers 12 | @import "mixins/breakpoints"; 13 | @import "mixins/color-scheme"; 14 | @import "mixins/image"; 15 | @import "mixins/resize"; 16 | @import "mixins/visually-hidden"; 17 | @import "mixins/reset-text"; 18 | @import "mixins/text-truncate"; 19 | 20 | // Utilities 21 | @import "mixins/utilities"; 22 | 23 | // Components 24 | @import "mixins/alert"; 25 | @import "mixins/backdrop"; 26 | @import "mixins/buttons"; 27 | @import "mixins/caret"; 28 | @import "mixins/pagination"; 29 | @import "mixins/lists"; 30 | @import "mixins/list-group"; 31 | @import "mixins/forms"; 32 | @import "mixins/table-variants"; 33 | 34 | // Skins 35 | @import "mixins/border-radius"; 36 | @import "mixins/box-shadow"; 37 | @import "mixins/gradients"; 38 | @import "mixins/transition"; 39 | 40 | // Layout 41 | @import "mixins/clearfix"; 42 | @import "mixins/container"; 43 | @import "mixins/grid"; 44 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_offcanvas.scss: -------------------------------------------------------------------------------- 1 | .offcanvas { 2 | position: fixed; 3 | bottom: 0; 4 | z-index: $zindex-offcanvas; 5 | display: flex; 6 | flex-direction: column; 7 | max-width: 100%; 8 | color: $offcanvas-color; 9 | visibility: hidden; 10 | background-color: $offcanvas-bg-color; 11 | background-clip: padding-box; 12 | outline: 0; 13 | @include box-shadow($offcanvas-box-shadow); 14 | @include transition(transform $offcanvas-transition-duration ease-in-out); 15 | } 16 | 17 | .offcanvas-backdrop { 18 | @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity); 19 | } 20 | 21 | .offcanvas-header { 22 | display: flex; 23 | align-items: center; 24 | justify-content: space-between; 25 | padding: $offcanvas-padding-y $offcanvas-padding-x; 26 | 27 | .btn-close { 28 | padding: ($offcanvas-padding-y * .5) ($offcanvas-padding-x * .5); 29 | margin-top: $offcanvas-padding-y * -.5; 30 | margin-right: $offcanvas-padding-x * -.5; 31 | margin-bottom: $offcanvas-padding-y * -.5; 32 | } 33 | } 34 | 35 | .offcanvas-title { 36 | margin-bottom: 0; 37 | line-height: $offcanvas-title-line-height; 38 | } 39 | 40 | .offcanvas-body { 41 | flex-grow: 1; 42 | padding: $offcanvas-padding-y $offcanvas-padding-x; 43 | overflow-y: auto; 44 | } 45 | 46 | .offcanvas-start { 47 | top: 0; 48 | left: 0; 49 | width: $offcanvas-horizontal-width; 50 | border-right: $offcanvas-border-width solid $offcanvas-border-color; 51 | transform: translateX(-100%); 52 | } 53 | 54 | .offcanvas-end { 55 | top: 0; 56 | right: 0; 57 | width: $offcanvas-horizontal-width; 58 | border-left: $offcanvas-border-width solid $offcanvas-border-color; 59 | transform: translateX(100%); 60 | } 61 | 62 | .offcanvas-top { 63 | top: 0; 64 | right: 0; 65 | left: 0; 66 | height: $offcanvas-vertical-height; 67 | max-height: 100%; 68 | border-bottom: $offcanvas-border-width solid $offcanvas-border-color; 69 | transform: translateY(-100%); 70 | } 71 | 72 | .offcanvas-bottom { 73 | right: 0; 74 | left: 0; 75 | height: $offcanvas-vertical-height; 76 | max-height: 100%; 77 | border-top: $offcanvas-border-width solid $offcanvas-border-color; 78 | transform: translateY(100%); 79 | } 80 | 81 | .offcanvas.show { 82 | transform: none; 83 | } 84 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_pagination.scss: -------------------------------------------------------------------------------- 1 | .pagination { 2 | display: flex; 3 | @include list-unstyled(); 4 | } 5 | 6 | .page-link { 7 | position: relative; 8 | display: block; 9 | color: $pagination-color; 10 | text-decoration: if($link-decoration == none, null, none); 11 | background-color: $pagination-bg; 12 | border: $pagination-border-width solid $pagination-border-color; 13 | @include transition($pagination-transition); 14 | 15 | &:hover { 16 | z-index: 2; 17 | color: $pagination-hover-color; 18 | text-decoration: if($link-hover-decoration == underline, none, null); 19 | background-color: $pagination-hover-bg; 20 | border-color: $pagination-hover-border-color; 21 | } 22 | 23 | &:focus { 24 | z-index: 3; 25 | color: $pagination-focus-color; 26 | background-color: $pagination-focus-bg; 27 | outline: $pagination-focus-outline; 28 | box-shadow: $pagination-focus-box-shadow; 29 | } 30 | } 31 | 32 | .page-item { 33 | &:not(:first-child) .page-link { 34 | margin-left: $pagination-margin-start; 35 | } 36 | 37 | &.active .page-link { 38 | z-index: 3; 39 | color: $pagination-active-color; 40 | @include gradient-bg($pagination-active-bg); 41 | border-color: $pagination-active-border-color; 42 | } 43 | 44 | &.disabled .page-link { 45 | color: $pagination-disabled-color; 46 | pointer-events: none; 47 | background-color: $pagination-disabled-bg; 48 | border-color: $pagination-disabled-border-color; 49 | } 50 | } 51 | 52 | 53 | // 54 | // Sizing 55 | // 56 | @include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius); 57 | 58 | .pagination-lg { 59 | @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg); 60 | } 61 | 62 | .pagination-sm { 63 | @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm); 64 | } 65 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_placeholders.scss: -------------------------------------------------------------------------------- 1 | .placeholder { 2 | display: inline-block; 3 | min-height: 1em; 4 | vertical-align: middle; 5 | cursor: wait; 6 | background-color: currentColor; 7 | opacity: $placeholder-opacity-max; 8 | 9 | &.btn::before { 10 | display: inline-block; 11 | content: ""; 12 | } 13 | } 14 | 15 | // Sizing 16 | .placeholder-xs { 17 | min-height: .6em; 18 | } 19 | 20 | .placeholder-sm { 21 | min-height: .8em; 22 | } 23 | 24 | .placeholder-lg { 25 | min-height: 1.2em; 26 | } 27 | 28 | // Animation 29 | .placeholder-glow { 30 | .placeholder { 31 | animation: placeholder-glow 2s ease-in-out infinite; 32 | } 33 | } 34 | 35 | @keyframes placeholder-glow { 36 | 50% { 37 | opacity: $placeholder-opacity-min; 38 | } 39 | } 40 | 41 | .placeholder-wave { 42 | mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%); 43 | mask-size: 200% 100%; 44 | animation: placeholder-wave 2s linear infinite; 45 | } 46 | 47 | @keyframes placeholder-wave { 48 | 100% { 49 | mask-position: -200% 0%; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_progress.scss: -------------------------------------------------------------------------------- 1 | // Disable animation if transitions are disabled 2 | 3 | // scss-docs-start progress-keyframes 4 | @if $enable-transitions { 5 | @keyframes progress-bar-stripes { 6 | 0% { background-position-x: $progress-height; } 7 | } 8 | } 9 | // scss-docs-end progress-keyframes 10 | 11 | .progress { 12 | display: flex; 13 | height: $progress-height; 14 | overflow: hidden; // force rounded corners by cropping it 15 | @include font-size($progress-font-size); 16 | background-color: $progress-bg; 17 | @include border-radius($progress-border-radius); 18 | @include box-shadow($progress-box-shadow); 19 | } 20 | 21 | .progress-bar { 22 | display: flex; 23 | flex-direction: column; 24 | justify-content: center; 25 | overflow: hidden; 26 | color: $progress-bar-color; 27 | text-align: center; 28 | white-space: nowrap; 29 | background-color: $progress-bar-bg; 30 | @include transition($progress-bar-transition); 31 | } 32 | 33 | .progress-bar-striped { 34 | @include gradient-striped(); 35 | background-size: $progress-height $progress-height; 36 | } 37 | 38 | @if $enable-transitions { 39 | .progress-bar-animated { 40 | animation: $progress-bar-animation-timing progress-bar-stripes; 41 | 42 | @if $enable-reduced-motion { 43 | @media (prefers-reduced-motion: reduce) { 44 | animation: none; 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_root.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | // Note: Custom variable values only support SassScript inside `#{}`. 3 | 4 | // Colors 5 | // 6 | // Generate palettes for full colors, grays, and theme colors. 7 | 8 | @each $color, $value in $colors { 9 | --#{$variable-prefix}#{$color}: #{$value}; 10 | } 11 | 12 | @each $color, $value in $grays { 13 | --#{$variable-prefix}gray-#{$color}: #{$value}; 14 | } 15 | 16 | @each $color, $value in $theme-colors { 17 | --#{$variable-prefix}#{$color}: #{$value}; 18 | } 19 | 20 | @each $color, $value in $theme-colors-rgb { 21 | --#{$variable-prefix}#{$color}-rgb: #{$value}; 22 | } 23 | 24 | --#{$variable-prefix}white-rgb: #{to-rgb($white)}; 25 | --#{$variable-prefix}black-rgb: #{to-rgb($black)}; 26 | --#{$variable-prefix}body-color-rgb: #{to-rgb($body-color)}; 27 | --#{$variable-prefix}body-bg-rgb: #{to-rgb($body-bg)}; 28 | 29 | // Fonts 30 | 31 | // Note: Use `inspect` for lists so that quoted items keep the quotes. 32 | // See https://github.com/sass/sass/issues/2383#issuecomment-336349172 33 | --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)}; 34 | --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)}; 35 | --#{$variable-prefix}gradient: #{$gradient}; 36 | 37 | // Root and body 38 | // stylelint-disable custom-property-empty-line-before 39 | // scss-docs-start root-body-variables 40 | @if $font-size-root != null { 41 | --#{$variable-prefix}root-font-size: #{$font-size-root}; 42 | } 43 | --#{$variable-prefix}body-font-family: #{$font-family-base}; 44 | --#{$variable-prefix}body-font-size: #{$font-size-base}; 45 | --#{$variable-prefix}body-font-weight: #{$font-weight-base}; 46 | --#{$variable-prefix}body-line-height: #{$line-height-base}; 47 | --#{$variable-prefix}body-color: #{$body-color}; 48 | @if $body-text-align != null { 49 | --#{$variable-prefix}body-text-align: #{$body-text-align}; 50 | } 51 | --#{$variable-prefix}body-bg: #{$body-bg}; 52 | // scss-docs-end root-body-variables 53 | // stylelint-enable custom-property-empty-line-before 54 | } 55 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_spinners.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Rotating border 3 | // 4 | 5 | // scss-docs-start spinner-border-keyframes 6 | @keyframes spinner-border { 7 | to { transform: rotate(360deg) #{"/* rtl:ignore */"}; } 8 | } 9 | // scss-docs-end spinner-border-keyframes 10 | 11 | .spinner-border { 12 | display: inline-block; 13 | width: $spinner-width; 14 | height: $spinner-height; 15 | vertical-align: $spinner-vertical-align; 16 | border: $spinner-border-width solid currentColor; 17 | border-right-color: transparent; 18 | // stylelint-disable-next-line property-disallowed-list 19 | border-radius: 50%; 20 | animation: $spinner-animation-speed linear infinite spinner-border; 21 | } 22 | 23 | .spinner-border-sm { 24 | width: $spinner-width-sm; 25 | height: $spinner-height-sm; 26 | border-width: $spinner-border-width-sm; 27 | } 28 | 29 | // 30 | // Growing circle 31 | // 32 | 33 | // scss-docs-start spinner-grow-keyframes 34 | @keyframes spinner-grow { 35 | 0% { 36 | transform: scale(0); 37 | } 38 | 50% { 39 | opacity: 1; 40 | transform: none; 41 | } 42 | } 43 | // scss-docs-end spinner-grow-keyframes 44 | 45 | .spinner-grow { 46 | display: inline-block; 47 | width: $spinner-width; 48 | height: $spinner-height; 49 | vertical-align: $spinner-vertical-align; 50 | background-color: currentColor; 51 | // stylelint-disable-next-line property-disallowed-list 52 | border-radius: 50%; 53 | opacity: 0; 54 | animation: $spinner-animation-speed linear infinite spinner-grow; 55 | } 56 | 57 | .spinner-grow-sm { 58 | width: $spinner-width-sm; 59 | height: $spinner-height-sm; 60 | } 61 | 62 | @if $enable-reduced-motion { 63 | @media (prefers-reduced-motion: reduce) { 64 | .spinner-border, 65 | .spinner-grow { 66 | animation-duration: $spinner-animation-speed * 2; 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_toasts.scss: -------------------------------------------------------------------------------- 1 | .toast { 2 | width: $toast-max-width; 3 | max-width: 100%; 4 | @include font-size($toast-font-size); 5 | color: $toast-color; 6 | pointer-events: auto; 7 | background-color: $toast-background-color; 8 | background-clip: padding-box; 9 | border: $toast-border-width solid $toast-border-color; 10 | box-shadow: $toast-box-shadow; 11 | @include border-radius($toast-border-radius); 12 | 13 | &.showing { 14 | opacity: 0; 15 | } 16 | 17 | &:not(.show) { 18 | display: none; 19 | } 20 | } 21 | 22 | .toast-container { 23 | width: max-content; 24 | max-width: 100%; 25 | pointer-events: none; 26 | 27 | > :not(:last-child) { 28 | margin-bottom: $toast-spacing; 29 | } 30 | } 31 | 32 | .toast-header { 33 | display: flex; 34 | align-items: center; 35 | padding: $toast-padding-y $toast-padding-x; 36 | color: $toast-header-color; 37 | background-color: $toast-header-background-color; 38 | background-clip: padding-box; 39 | border-bottom: $toast-border-width solid $toast-header-border-color; 40 | @include border-top-radius(subtract($toast-border-radius, $toast-border-width)); 41 | 42 | .btn-close { 43 | margin-right: $toast-padding-x * -.5; 44 | margin-left: $toast-padding-x; 45 | } 46 | } 47 | 48 | .toast-body { 49 | padding: $toast-padding-x; // apply to both vertical and horizontal 50 | word-wrap: break-word; 51 | } 52 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_transitions.scss: -------------------------------------------------------------------------------- 1 | .fade { 2 | @include transition($transition-fade); 3 | 4 | &:not(.show) { 5 | opacity: 0; 6 | } 7 | } 8 | 9 | // scss-docs-start collapse-classes 10 | .collapse { 11 | &:not(.show) { 12 | display: none; 13 | } 14 | } 15 | 16 | .collapsing { 17 | height: 0; 18 | overflow: hidden; 19 | @include transition($transition-collapse); 20 | 21 | &.collapse-horizontal { 22 | width: 0; 23 | height: auto; 24 | @include transition($transition-collapse-width); 25 | } 26 | } 27 | // scss-docs-end collapse-classes 28 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/_type.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Headings 3 | // 4 | .h1 { 5 | @extend h1; 6 | } 7 | 8 | .h2 { 9 | @extend h2; 10 | } 11 | 12 | .h3 { 13 | @extend h3; 14 | } 15 | 16 | .h4 { 17 | @extend h4; 18 | } 19 | 20 | .h5 { 21 | @extend h5; 22 | } 23 | 24 | .h6 { 25 | @extend h6; 26 | } 27 | 28 | 29 | .lead { 30 | @include font-size($lead-font-size); 31 | font-weight: $lead-font-weight; 32 | } 33 | 34 | // Type display classes 35 | @each $display, $font-size in $display-font-sizes { 36 | .display-#{$display} { 37 | @include font-size($font-size); 38 | font-weight: $display-font-weight; 39 | line-height: $display-line-height; 40 | } 41 | } 42 | 43 | // 44 | // Emphasis 45 | // 46 | .small { 47 | @extend small; 48 | } 49 | 50 | .mark { 51 | @extend mark; 52 | } 53 | 54 | // 55 | // Lists 56 | // 57 | 58 | .list-unstyled { 59 | @include list-unstyled(); 60 | } 61 | 62 | // Inline turns list items into inline-block 63 | .list-inline { 64 | @include list-unstyled(); 65 | } 66 | .list-inline-item { 67 | display: inline-block; 68 | 69 | &:not(:last-child) { 70 | margin-right: $list-inline-padding; 71 | } 72 | } 73 | 74 | 75 | // 76 | // Misc 77 | // 78 | 79 | // Builds on `abbr` 80 | .initialism { 81 | @include font-size($initialism-font-size); 82 | text-transform: uppercase; 83 | } 84 | 85 | // Blockquotes 86 | .blockquote { 87 | margin-bottom: $blockquote-margin-y; 88 | @include font-size($blockquote-font-size); 89 | 90 | > :last-child { 91 | margin-bottom: 0; 92 | } 93 | } 94 | 95 | .blockquote-footer { 96 | margin-top: -$blockquote-margin-y; 97 | margin-bottom: $blockquote-margin-y; 98 | @include font-size($blockquote-footer-font-size); 99 | color: $blockquote-footer-color; 100 | 101 | &::before { 102 | content: "\2014\00A0"; // em dash, nbsp 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/bootstrap-grid.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grid v5.1.3 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | */ 7 | 8 | $include-column-box-sizing: true !default; 9 | 10 | @import "functions"; 11 | @import "variables"; 12 | 13 | @import "mixins/lists"; 14 | @import "mixins/breakpoints"; 15 | @import "mixins/container"; 16 | @import "mixins/grid"; 17 | @import "mixins/utilities"; 18 | 19 | @import "vendor/rfs"; 20 | 21 | @import "root"; 22 | 23 | @import "containers"; 24 | @import "grid"; 25 | 26 | @import "utilities"; 27 | // Only use the utilities we need 28 | // stylelint-disable-next-line scss/dollar-variable-default 29 | $utilities: map-get-multiple( 30 | $utilities, 31 | ( 32 | "display", 33 | "order", 34 | "flex", 35 | "flex-direction", 36 | "flex-grow", 37 | "flex-shrink", 38 | "flex-wrap", 39 | "justify-content", 40 | "align-items", 41 | "align-content", 42 | "align-self", 43 | "margin", 44 | "margin-x", 45 | "margin-y", 46 | "margin-top", 47 | "margin-end", 48 | "margin-bottom", 49 | "margin-start", 50 | "negative-margin", 51 | "negative-margin-x", 52 | "negative-margin-y", 53 | "negative-margin-top", 54 | "negative-margin-end", 55 | "negative-margin-bottom", 56 | "negative-margin-start", 57 | "padding", 58 | "padding-x", 59 | "padding-y", 60 | "padding-top", 61 | "padding-end", 62 | "padding-bottom", 63 | "padding-start", 64 | ) 65 | ); 66 | 67 | @import "utilities/api"; 68 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/bootstrap-reboot.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v5.1.3 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | 9 | @import "functions"; 10 | @import "variables"; 11 | @import "mixins"; 12 | @import "root"; 13 | @import "reboot"; 14 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/bootstrap-utilities.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Utilities v5.1.3 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | */ 7 | 8 | // Configuration 9 | @import "functions"; 10 | @import "variables"; 11 | @import "mixins"; 12 | @import "utilities"; 13 | 14 | // Helpers 15 | @import "helpers"; 16 | 17 | // Utilities 18 | @import "utilities/api"; 19 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/bootstrap.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v5.1.3 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | */ 7 | 8 | // scss-docs-start import-stack 9 | // Configuration 10 | @import "functions"; 11 | @import "variables"; 12 | @import "mixins"; 13 | @import "utilities"; 14 | 15 | // Layout & components 16 | @import "root"; 17 | @import "reboot"; 18 | @import "type"; 19 | @import "images"; 20 | @import "containers"; 21 | @import "grid"; 22 | @import "tables"; 23 | @import "forms"; 24 | @import "buttons"; 25 | @import "transitions"; 26 | @import "dropdown"; 27 | @import "button-group"; 28 | @import "nav"; 29 | @import "navbar"; 30 | @import "card"; 31 | @import "accordion"; 32 | @import "breadcrumb"; 33 | @import "pagination"; 34 | @import "badge"; 35 | @import "alert"; 36 | @import "progress"; 37 | @import "list-group"; 38 | @import "close"; 39 | @import "toasts"; 40 | @import "modal"; 41 | @import "tooltip"; 42 | @import "popover"; 43 | @import "carousel"; 44 | @import "spinners"; 45 | @import "offcanvas"; 46 | @import "placeholders"; 47 | 48 | // Helpers 49 | @import "helpers"; 50 | 51 | // Utilities 52 | @import "utilities/api"; 53 | // scss-docs-end import-stack 54 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/forms/_floating-labels.scss: -------------------------------------------------------------------------------- 1 | .form-floating { 2 | position: relative; 3 | 4 | > .form-control, 5 | > .form-select { 6 | height: $form-floating-height; 7 | line-height: $form-floating-line-height; 8 | } 9 | 10 | > label { 11 | position: absolute; 12 | top: 0; 13 | left: 0; 14 | height: 100%; // allow textareas 15 | padding: $form-floating-padding-y $form-floating-padding-x; 16 | pointer-events: none; 17 | border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model 18 | transform-origin: 0 0; 19 | @include transition($form-floating-transition); 20 | } 21 | 22 | // stylelint-disable no-duplicate-selectors 23 | > .form-control { 24 | padding: $form-floating-padding-y $form-floating-padding-x; 25 | 26 | &::placeholder { 27 | color: transparent; 28 | } 29 | 30 | &:focus, 31 | &:not(:placeholder-shown) { 32 | padding-top: $form-floating-input-padding-t; 33 | padding-bottom: $form-floating-input-padding-b; 34 | } 35 | // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped 36 | &:-webkit-autofill { 37 | padding-top: $form-floating-input-padding-t; 38 | padding-bottom: $form-floating-input-padding-b; 39 | } 40 | } 41 | 42 | > .form-select { 43 | padding-top: $form-floating-input-padding-t; 44 | padding-bottom: $form-floating-input-padding-b; 45 | } 46 | 47 | > .form-control:focus, 48 | > .form-control:not(:placeholder-shown), 49 | > .form-select { 50 | ~ label { 51 | opacity: $form-floating-label-opacity; 52 | transform: $form-floating-label-transform; 53 | } 54 | } 55 | // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped 56 | > .form-control:-webkit-autofill { 57 | ~ label { 58 | opacity: $form-floating-label-opacity; 59 | transform: $form-floating-label-transform; 60 | } 61 | } 62 | // stylelint-enable no-duplicate-selectors 63 | } 64 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/forms/_form-text.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Form text 3 | // 4 | 5 | .form-text { 6 | margin-top: $form-text-margin-top; 7 | @include font-size($form-text-font-size); 8 | font-style: $form-text-font-style; 9 | font-weight: $form-text-font-weight; 10 | color: $form-text-color; 11 | } 12 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/forms/_labels.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // 4 | 5 | .form-label { 6 | margin-bottom: $form-label-margin-bottom; 7 | @include font-size($form-label-font-size); 8 | font-style: $form-label-font-style; 9 | font-weight: $form-label-font-weight; 10 | color: $form-label-color; 11 | } 12 | 13 | // For use with horizontal and inline forms, when you need the label (or legend) 14 | // text to align with the form controls. 15 | .col-form-label { 16 | padding-top: add($input-padding-y, $input-border-width); 17 | padding-bottom: add($input-padding-y, $input-border-width); 18 | margin-bottom: 0; // Override the `` default 19 | @include font-size(inherit); // Override the `` default 20 | font-style: $form-label-font-style; 21 | font-weight: $form-label-font-weight; 22 | line-height: $input-line-height; 23 | color: $form-label-color; 24 | } 25 | 26 | .col-form-label-lg { 27 | padding-top: add($input-padding-y-lg, $input-border-width); 28 | padding-bottom: add($input-padding-y-lg, $input-border-width); 29 | @include font-size($input-font-size-lg); 30 | } 31 | 32 | .col-form-label-sm { 33 | padding-top: add($input-padding-y-sm, $input-border-width); 34 | padding-bottom: add($input-padding-y-sm, $input-border-width); 35 | @include font-size($input-font-size-sm); 36 | } 37 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/forms/_validation.scss: -------------------------------------------------------------------------------- 1 | // Form validation 2 | // 3 | // Provide feedback to users when form field values are valid or invalid. Works 4 | // primarily for client-side validation via scoped `:invalid` and `:valid` 5 | // pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for 6 | // server-side validation. 7 | 8 | // scss-docs-start form-validation-states-loop 9 | @each $state, $data in $form-validation-states { 10 | @include form-validation-state($state, $data...); 11 | } 12 | // scss-docs-end form-validation-states-loop 13 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/helpers/_clearfix.scss: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | @include clearfix(); 3 | } 4 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/helpers/_colored-links.scss: -------------------------------------------------------------------------------- 1 | @each $color, $value in $theme-colors { 2 | .link-#{$color} { 3 | color: $value; 4 | 5 | @if $link-shade-percentage != 0 { 6 | &:hover, 7 | &:focus { 8 | color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage)); 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/helpers/_position.scss: -------------------------------------------------------------------------------- 1 | // Shorthand 2 | 3 | .fixed-top { 4 | position: fixed; 5 | top: 0; 6 | right: 0; 7 | left: 0; 8 | z-index: $zindex-fixed; 9 | } 10 | 11 | .fixed-bottom { 12 | position: fixed; 13 | right: 0; 14 | bottom: 0; 15 | left: 0; 16 | z-index: $zindex-fixed; 17 | } 18 | 19 | // Responsive sticky top 20 | @each $breakpoint in map-keys($grid-breakpoints) { 21 | @include media-breakpoint-up($breakpoint) { 22 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 23 | 24 | .sticky#{$infix}-top { 25 | position: sticky; 26 | top: 0; 27 | z-index: $zindex-sticky; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/helpers/_ratio.scss: -------------------------------------------------------------------------------- 1 | // Credit: Nicolas Gallagher and SUIT CSS. 2 | 3 | .ratio { 4 | position: relative; 5 | width: 100%; 6 | 7 | &::before { 8 | display: block; 9 | padding-top: var(--#{$variable-prefix}aspect-ratio); 10 | content: ""; 11 | } 12 | 13 | > * { 14 | position: absolute; 15 | top: 0; 16 | left: 0; 17 | width: 100%; 18 | height: 100%; 19 | } 20 | } 21 | 22 | @each $key, $ratio in $aspect-ratios { 23 | .ratio-#{$key} { 24 | --#{$variable-prefix}aspect-ratio: #{$ratio}; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/helpers/_stacks.scss: -------------------------------------------------------------------------------- 1 | // scss-docs-start stacks 2 | .hstack { 3 | display: flex; 4 | flex-direction: row; 5 | align-items: center; 6 | align-self: stretch; 7 | } 8 | 9 | .vstack { 10 | display: flex; 11 | flex: 1 1 auto; 12 | flex-direction: column; 13 | align-self: stretch; 14 | } 15 | // scss-docs-end stacks 16 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/helpers/_stretched-link.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Stretched link 3 | // 4 | 5 | .stretched-link { 6 | &::#{$stretched-link-pseudo-element} { 7 | position: absolute; 8 | top: 0; 9 | right: 0; 10 | bottom: 0; 11 | left: 0; 12 | z-index: $stretched-link-z-index; 13 | content: ""; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/helpers/_text-truncation.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Text truncation 3 | // 4 | 5 | .text-truncate { 6 | @include text-truncate(); 7 | } 8 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/helpers/_visually-hidden.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Visually hidden 3 | // 4 | 5 | .visually-hidden, 6 | .visually-hidden-focusable:not(:focus):not(:focus-within) { 7 | @include visually-hidden(); 8 | } 9 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/helpers/_vr.scss: -------------------------------------------------------------------------------- 1 | .vr { 2 | display: inline-block; 3 | align-self: stretch; 4 | width: 1px; 5 | min-height: 1em; 6 | background-color: currentColor; 7 | opacity: $hr-opacity; 8 | } 9 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_alert.scss: -------------------------------------------------------------------------------- 1 | // scss-docs-start alert-variant-mixin 2 | @mixin alert-variant($background, $border, $color) { 3 | color: $color; 4 | @include gradient-bg($background); 5 | border-color: $border; 6 | 7 | .alert-link { 8 | color: shade-color($color, 20%); 9 | } 10 | } 11 | // scss-docs-end alert-variant-mixin 12 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_backdrop.scss: -------------------------------------------------------------------------------- 1 | // Shared between modals and offcanvases 2 | @mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) { 3 | position: fixed; 4 | top: 0; 5 | left: 0; 6 | z-index: $zindex; 7 | width: 100vw; 8 | height: 100vh; 9 | background-color: $backdrop-bg; 10 | 11 | // Fade for backdrop 12 | &.fade { opacity: 0; } 13 | &.show { opacity: $backdrop-opacity; } 14 | } 15 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_border-radius.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable property-disallowed-list 2 | // Single side border-radius 3 | 4 | // Helper function to replace negative values with 0 5 | @function valid-radius($radius) { 6 | $return: (); 7 | @each $value in $radius { 8 | @if type-of($value) == number { 9 | $return: append($return, max($value, 0)); 10 | } @else { 11 | $return: append($return, $value); 12 | } 13 | } 14 | @return $return; 15 | } 16 | 17 | // scss-docs-start border-radius-mixins 18 | @mixin border-radius($radius: $border-radius, $fallback-border-radius: false) { 19 | @if $enable-rounded { 20 | border-radius: valid-radius($radius); 21 | } 22 | @else if $fallback-border-radius != false { 23 | border-radius: $fallback-border-radius; 24 | } 25 | } 26 | 27 | @mixin border-top-radius($radius: $border-radius) { 28 | @if $enable-rounded { 29 | border-top-left-radius: valid-radius($radius); 30 | border-top-right-radius: valid-radius($radius); 31 | } 32 | } 33 | 34 | @mixin border-end-radius($radius: $border-radius) { 35 | @if $enable-rounded { 36 | border-top-right-radius: valid-radius($radius); 37 | border-bottom-right-radius: valid-radius($radius); 38 | } 39 | } 40 | 41 | @mixin border-bottom-radius($radius: $border-radius) { 42 | @if $enable-rounded { 43 | border-bottom-right-radius: valid-radius($radius); 44 | border-bottom-left-radius: valid-radius($radius); 45 | } 46 | } 47 | 48 | @mixin border-start-radius($radius: $border-radius) { 49 | @if $enable-rounded { 50 | border-top-left-radius: valid-radius($radius); 51 | border-bottom-left-radius: valid-radius($radius); 52 | } 53 | } 54 | 55 | @mixin border-top-start-radius($radius: $border-radius) { 56 | @if $enable-rounded { 57 | border-top-left-radius: valid-radius($radius); 58 | } 59 | } 60 | 61 | @mixin border-top-end-radius($radius: $border-radius) { 62 | @if $enable-rounded { 63 | border-top-right-radius: valid-radius($radius); 64 | } 65 | } 66 | 67 | @mixin border-bottom-end-radius($radius: $border-radius) { 68 | @if $enable-rounded { 69 | border-bottom-right-radius: valid-radius($radius); 70 | } 71 | } 72 | 73 | @mixin border-bottom-start-radius($radius: $border-radius) { 74 | @if $enable-rounded { 75 | border-bottom-left-radius: valid-radius($radius); 76 | } 77 | } 78 | // scss-docs-end border-radius-mixins 79 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_box-shadow.scss: -------------------------------------------------------------------------------- 1 | @mixin box-shadow($shadow...) { 2 | @if $enable-shadows { 3 | $result: (); 4 | 5 | @each $value in $shadow { 6 | @if $value != null { 7 | $result: append($result, $value, "comma"); 8 | } 9 | @if $value == none and length($shadow) > 1 { 10 | @warn "The keyword 'none' must be used as a single argument."; 11 | } 12 | } 13 | 14 | @if (length($result) > 0) { 15 | box-shadow: $result; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_caret.scss: -------------------------------------------------------------------------------- 1 | // scss-docs-start caret-mixins 2 | @mixin caret-down { 3 | border-top: $caret-width solid; 4 | border-right: $caret-width solid transparent; 5 | border-bottom: 0; 6 | border-left: $caret-width solid transparent; 7 | } 8 | 9 | @mixin caret-up { 10 | border-top: 0; 11 | border-right: $caret-width solid transparent; 12 | border-bottom: $caret-width solid; 13 | border-left: $caret-width solid transparent; 14 | } 15 | 16 | @mixin caret-end { 17 | border-top: $caret-width solid transparent; 18 | border-right: 0; 19 | border-bottom: $caret-width solid transparent; 20 | border-left: $caret-width solid; 21 | } 22 | 23 | @mixin caret-start { 24 | border-top: $caret-width solid transparent; 25 | border-right: $caret-width solid; 26 | border-bottom: $caret-width solid transparent; 27 | } 28 | 29 | @mixin caret($direction: down) { 30 | @if $enable-caret { 31 | &::after { 32 | display: inline-block; 33 | margin-left: $caret-spacing; 34 | vertical-align: $caret-vertical-align; 35 | content: ""; 36 | @if $direction == down { 37 | @include caret-down(); 38 | } @else if $direction == up { 39 | @include caret-up(); 40 | } @else if $direction == end { 41 | @include caret-end(); 42 | } 43 | } 44 | 45 | @if $direction == start { 46 | &::after { 47 | display: none; 48 | } 49 | 50 | &::before { 51 | display: inline-block; 52 | margin-right: $caret-spacing; 53 | vertical-align: $caret-vertical-align; 54 | content: ""; 55 | @include caret-start(); 56 | } 57 | } 58 | 59 | &:empty::after { 60 | margin-left: 0; 61 | } 62 | } 63 | } 64 | // scss-docs-end caret-mixins 65 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_clearfix.scss: -------------------------------------------------------------------------------- 1 | // scss-docs-start clearfix 2 | @mixin clearfix() { 3 | &::after { 4 | display: block; 5 | clear: both; 6 | content: ""; 7 | } 8 | } 9 | // scss-docs-end clearfix 10 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_color-scheme.scss: -------------------------------------------------------------------------------- 1 | // scss-docs-start mixin-color-scheme 2 | @mixin color-scheme($name) { 3 | @media (prefers-color-scheme: #{$name}) { 4 | @content; 5 | } 6 | } 7 | // scss-docs-end mixin-color-scheme 8 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_container.scss: -------------------------------------------------------------------------------- 1 | // Container mixins 2 | 3 | @mixin make-container($gutter: $container-padding-x) { 4 | width: 100%; 5 | padding-right: var(--#{$variable-prefix}gutter-x, #{$gutter}); 6 | padding-left: var(--#{$variable-prefix}gutter-x, #{$gutter}); 7 | margin-right: auto; 8 | margin-left: auto; 9 | } 10 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_deprecate.scss: -------------------------------------------------------------------------------- 1 | // Deprecate mixin 2 | // 3 | // This mixin can be used to deprecate mixins or functions. 4 | // `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to 5 | // some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap) 6 | @mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) { 7 | @if ($enable-deprecation-messages != false and $ignore-warning != true) { 8 | @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}."; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_gradients.scss: -------------------------------------------------------------------------------- 1 | // Gradients 2 | 3 | // scss-docs-start gradient-bg-mixin 4 | @mixin gradient-bg($color: null) { 5 | background-color: $color; 6 | 7 | @if $enable-gradients { 8 | background-image: var(--#{$variable-prefix}gradient); 9 | } 10 | } 11 | // scss-docs-end gradient-bg-mixin 12 | 13 | // scss-docs-start gradient-mixins 14 | // Horizontal gradient, from left to right 15 | // 16 | // Creates two color stops, start and end, by specifying a color and position for each color stop. 17 | @mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) { 18 | background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); 19 | } 20 | 21 | // Vertical gradient, from top to bottom 22 | // 23 | // Creates two color stops, start and end, by specifying a color and position for each color stop. 24 | @mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) { 25 | background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); 26 | } 27 | 28 | @mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) { 29 | background-image: linear-gradient($deg, $start-color, $end-color); 30 | } 31 | 32 | @mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) { 33 | background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color); 34 | } 35 | 36 | @mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) { 37 | background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color); 38 | } 39 | 40 | @mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) { 41 | background-image: radial-gradient(circle, $inner-color, $outer-color); 42 | } 43 | 44 | @mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) { 45 | background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent); 46 | } 47 | // scss-docs-end gradient-mixins 48 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_image.scss: -------------------------------------------------------------------------------- 1 | // Image Mixins 2 | // - Responsive image 3 | // - Retina image 4 | 5 | 6 | // Responsive image 7 | // 8 | // Keep images from scaling beyond the width of their parents. 9 | 10 | @mixin img-fluid { 11 | // Part 1: Set a maximum relative to the parent 12 | max-width: 100%; 13 | // Part 2: Override the height to auto, otherwise images will be stretched 14 | // when setting a width and height attribute on the img element. 15 | height: auto; 16 | } 17 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_list-group.scss: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | // scss-docs-start list-group-mixin 4 | @mixin list-group-item-variant($state, $background, $color) { 5 | .list-group-item-#{$state} { 6 | color: $color; 7 | background-color: $background; 8 | 9 | &.list-group-item-action { 10 | &:hover, 11 | &:focus { 12 | color: $color; 13 | background-color: shade-color($background, 10%); 14 | } 15 | 16 | &.active { 17 | color: $white; 18 | background-color: $color; 19 | border-color: $color; 20 | } 21 | } 22 | } 23 | } 24 | // scss-docs-end list-group-mixin 25 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_lists.scss: -------------------------------------------------------------------------------- 1 | // Lists 2 | 3 | // Unstyled keeps list items block level, just removes default browser padding and list-style 4 | @mixin list-unstyled { 5 | padding-left: 0; 6 | list-style: none; 7 | } 8 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | // scss-docs-start pagination-mixin 4 | @mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) { 5 | .page-link { 6 | padding: $padding-y $padding-x; 7 | @include font-size($font-size); 8 | } 9 | 10 | .page-item { 11 | @if $pagination-margin-start == (-$pagination-border-width) { 12 | &:first-child { 13 | .page-link { 14 | @include border-start-radius($border-radius); 15 | } 16 | } 17 | 18 | &:last-child { 19 | .page-link { 20 | @include border-end-radius($border-radius); 21 | } 22 | } 23 | } @else { 24 | //Add border-radius to all pageLinks in case they have left margin 25 | .page-link { 26 | @include border-radius($border-radius); 27 | } 28 | } 29 | } 30 | } 31 | // scss-docs-end pagination-mixin 32 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_reset-text.scss: -------------------------------------------------------------------------------- 1 | @mixin reset-text { 2 | font-family: $font-family-base; 3 | // We deliberately do NOT reset font-size or overflow-wrap / word-wrap. 4 | font-style: normal; 5 | font-weight: $font-weight-normal; 6 | line-height: $line-height-base; 7 | text-align: left; // Fallback for where `start` is not supported 8 | text-align: start; 9 | text-decoration: none; 10 | text-shadow: none; 11 | text-transform: none; 12 | letter-spacing: normal; 13 | word-break: normal; 14 | word-spacing: normal; 15 | white-space: normal; 16 | line-break: auto; 17 | } 18 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_resize.scss: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | @mixin resizable($direction) { 4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 5 | resize: $direction; // Options: horizontal, vertical, both 6 | } 7 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_table-variants.scss: -------------------------------------------------------------------------------- 1 | // scss-docs-start table-variant 2 | @mixin table-variant($state, $background) { 3 | .table-#{$state} { 4 | $color: color-contrast(opaque($body-bg, $background)); 5 | $hover-bg: mix($color, $background, percentage($table-hover-bg-factor)); 6 | $striped-bg: mix($color, $background, percentage($table-striped-bg-factor)); 7 | $active-bg: mix($color, $background, percentage($table-active-bg-factor)); 8 | 9 | --#{$variable-prefix}table-bg: #{$background}; 10 | --#{$variable-prefix}table-striped-bg: #{$striped-bg}; 11 | --#{$variable-prefix}table-striped-color: #{color-contrast($striped-bg)}; 12 | --#{$variable-prefix}table-active-bg: #{$active-bg}; 13 | --#{$variable-prefix}table-active-color: #{color-contrast($active-bg)}; 14 | --#{$variable-prefix}table-hover-bg: #{$hover-bg}; 15 | --#{$variable-prefix}table-hover-color: #{color-contrast($hover-bg)}; 16 | 17 | color: $color; 18 | border-color: mix($color, $background, percentage($table-border-factor)); 19 | } 20 | } 21 | // scss-docs-end table-variant 22 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_text-truncate.scss: -------------------------------------------------------------------------------- 1 | // Text truncate 2 | // Requires inline-block or block for proper styling 3 | 4 | @mixin text-truncate() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_transition.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable property-disallowed-list 2 | @mixin transition($transition...) { 3 | @if length($transition) == 0 { 4 | $transition: $transition-base; 5 | } 6 | 7 | @if length($transition) > 1 { 8 | @each $value in $transition { 9 | @if $value == null or $value == none { 10 | @warn "The keyword 'none' or 'null' must be used as a single argument."; 11 | } 12 | } 13 | } 14 | 15 | @if $enable-transitions { 16 | @if nth($transition, 1) != null { 17 | transition: $transition; 18 | } 19 | 20 | @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none { 21 | @media (prefers-reduced-motion: reduce) { 22 | transition: none; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/mixins/_visually-hidden.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Hide content visually while keeping it accessible to assistive technologies 4 | // 5 | // See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/ 6 | // See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/ 7 | 8 | @mixin visually-hidden() { 9 | position: absolute !important; 10 | width: 1px !important; 11 | height: 1px !important; 12 | padding: 0 !important; 13 | margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686 14 | overflow: hidden !important; 15 | clip: rect(0, 0, 0, 0) !important; 16 | white-space: nowrap !important; 17 | border: 0 !important; 18 | } 19 | 20 | // Use to only display content when it's focused, or one of its child elements is focused 21 | // (i.e. when focus is within the element/container that the class was applied to) 22 | // 23 | // Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 24 | 25 | @mixin visually-hidden-focusable() { 26 | &:not(:focus):not(:focus-within) { 27 | @include visually-hidden(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/static/scss/bootstrap/scss/utilities/_api.scss: -------------------------------------------------------------------------------- 1 | // Loop over each breakpoint 2 | @each $breakpoint in map-keys($grid-breakpoints) { 3 | 4 | // Generate media query if needed 5 | @include media-breakpoint-up($breakpoint) { 6 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 7 | 8 | // Loop over each utility property 9 | @each $key, $utility in $utilities { 10 | // The utility can be disabled with `false`, thus check if the utility is a map first 11 | // Only proceed if responsive media queries are enabled or if it's the base media query 12 | @if type-of($utility) == "map" and (map-get($utility, responsive) or $infix == "") { 13 | @include generate-utility($utility, $infix); 14 | } 15 | } 16 | } 17 | } 18 | 19 | // RFS rescaling 20 | @media (min-width: $rfs-mq-value) { 21 | @each $breakpoint in map-keys($grid-breakpoints) { 22 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 23 | 24 | @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) { 25 | // Loop over each utility property 26 | @each $key, $utility in $utilities { 27 | // The utility can be disabled with `false`, thus check if the utility is a map first 28 | // Only proceed if responsive media queries are enabled or if it's the base media query 29 | @if type-of($utility) == "map" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == "") { 30 | @include generate-utility($utility, $infix, true); 31 | } 32 | } 33 | } 34 | } 35 | } 36 | 37 | 38 | // Print utilities 39 | @media print { 40 | @each $key, $utility in $utilities { 41 | // The utility can be disabled with `false`, thus check if the utility is a map first 42 | // Then check if the utility needs print styles 43 | @if type-of($utility) == "map" and map-get($utility, print) == true { 44 | @include generate-utility($utility, "-print"); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/templates/admin/base_site.html: -------------------------------------------------------------------------------- 1 | 6 | 7 | {% extends "admin/base.html" %} 8 | {% load i18n static %} 9 | 10 | {% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | 11 | {{ site_title|default:_('Django site admin') }}{% endblock %} 12 | 13 | {% block branding %} 14 | 15 | 16 | {{ site_header|default:_('Django administration') }} 19 | {% endblock %} 20 | 21 | {% block nav-global %}{% endblock %} 22 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/templates/admin/grading/gradethresholds/change_form.html: -------------------------------------------------------------------------------- 1 | 6 | 7 | {% extends "admin/change_form.html" %} 8 | {% load daggerboard_templatetags %} 9 | {% load i18n admin_urls %} 10 | {% block field_sets %} 11 | {% for fieldset in adminform %} 12 | Please specify the score thresholds for each letter grade. 13 | 14 | 15 | {% if fieldset.name %}{{ fieldset.name }}{% endif %} 16 | {% if fieldset.description %} 17 | {{ fieldset.description }} 18 | {% endif %} 19 | {% for line in fieldset %} 20 | 21 | {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %} 22 | {% for field in line %} 23 | 24 | {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %} 25 | {% if field.is_checkbox %} 26 | {{ field.field }}{{ field.label_tag }} 27 | {% else %} 28 | {% if 'And less than:' in field.label_tag %} 29 | 30 | 31 | {{ field.label_tag }} 32 | {% else %} 33 | {{ field.label_tag|gradeThresholdAdminSplit:"-" | first}} 34 | {{ field.label_tag|gradeThresholdAdminSplit:"-" | last}}: 35 | {% endif %} 36 | {% if field.is_readonly %} 37 | {{ field.contents }} 38 | {% else %} 39 | {{ field.field }} 40 | {% endif %} 41 | {% endif %} 42 | 43 | {% endfor %} 44 | 45 | {% endfor %} 46 | 47 | 48 | {% endfor %} 49 | {% endblock %} -------------------------------------------------------------------------------- /apps/daggerboard_ui/templates/base.html: -------------------------------------------------------------------------------- 1 | 6 | 7 | {% load daggerboard_templatetags %} 8 | {% load static %} 9 | 10 | 11 | 12 | {# url definitions #} 13 | {% url 'vendor_scorecard' as vendor_sc %} 14 | {% url 'sbom_scorecard' as sbom_sc %} 15 | {% url 'sbom_report' as report_sc %} 16 | {% url 'home' as homepage %} 17 | 18 | {% include 'head.html'%} 19 | 20 | 21 | 22 | 23 | 24 | {% block navbar %} 25 | {% include 'navbar.html' %} 26 | {% endblock navbar %} 27 | 28 | 29 | 30 | {% block body_container %}{% endblock body_container %} 31 | 32 | {% block js_footer %} 33 | {% block bootstrap_js %} 34 | 35 | {% endblock bootstrap_js %} 36 | 37 | 38 | 39 | 40 | 41 | {% block js_script_content %} 42 | {% endblock js_script_content %} 43 | {% endblock js_footer %} 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/templates/head.html: -------------------------------------------------------------------------------- 1 | 6 | 7 | {% load static %} 8 | {% load compress %} 9 | {# make template modifiable using blocks #} 10 | {% block title %}Daggerboard{% endblock title %} 11 | {% block favicon %}{% endblock favicon %} 12 | {% block head_meta %} 13 | {% block head_meta_charset %} 14 | 15 | {% endblock head_meta_charset %} 16 | {% block head_meta_viewport %} 17 | 18 | {% endblock head_meta_viewport %} 19 | {% block head_meta_contentlanguage %} 20 | 21 | {% endblock head_meta_contentlanguage %} 22 | {% endblock head_meta %} 23 | {% block head_css %} 24 | 25 | {% compress css %} 26 | 27 | {% endcompress %} 28 | 29 | 30 | 31 | 34 | 35 | 38 | 39 | 40 | 41 | 42 | {% endblock head_css %} -------------------------------------------------------------------------------- /apps/daggerboard_ui/templates/login.html: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | {% include 'head.html'%} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | DaggerBoard 22 | SBOM Utility 23 | 24 | 25 | {% csrf_token %} 26 | 27 | Username 28 | 29 | 30 | 31 | Password 32 | 33 | 34 | 35 | 36 | 37 | 38 | {% for message in messages %} 39 | 40 | {{ message }} 41 | 42 | {% endfor %} 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/templates/not-found-page.html: -------------------------------------------------------------------------------- 1 | 6 | 7 | {% load static %} 8 | 9 | 10 | 11 | 12 | {% include 'head.html'%} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {{headerMsg}} 22 | {{bodyMsg}} 23 | 24 | 25 | {% csrf_token %} 26 | 27 | 28 | 29 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/templatetags/daggerboard_templatetags.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from django import template 6 | 7 | register = template.Library() 8 | 9 | 10 | @register.filter(name="has_group") 11 | def has_group(user, group_name): 12 | return user.groups.filter(name=group_name).exists() 13 | 14 | 15 | @register.filter 16 | def get_item(dictionary, key): 17 | return dictionary.get(key) 18 | 19 | 20 | @register.filter 21 | def gradeThresholdAdminSplit(string, split_at): 22 | """ 23 | Custom template tag for custom grade threshold admin panel 24 | """ 25 | if "And less " not in string: 26 | splitString = string.split(split_at) 27 | letterGrade = splitString[0].split(">")[1].strip() 28 | lessGreatThan = splitString[1].split(":")[0].strip() 29 | arr = [letterGrade, lessGreatThan] 30 | return arr 31 | else: 32 | return string 33 | -------------------------------------------------------------------------------- /apps/daggerboard_ui/tests.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from django.contrib.auth.models import User 6 | from django.test import Client, TestCase 7 | from django.urls import reverse 8 | 9 | 10 | class UnitTestCases(TestCase): 11 | def setUp(self): 12 | self.client = Client() 13 | 14 | def test_login_and_dashboard_page(self): 15 | self.user = User.objects.create(username="testuser") 16 | self.user.set_password("12345") 17 | self.user.save() 18 | response_login = self.client.post( 19 | reverse("home"), {"user_id": self.user.id}, follow=True 20 | ) 21 | self.assertEqual(response_login.status_code, 200) 22 | 23 | def test_sbom_page(self): 24 | response_sbom = self.client.get("/sbomscorecard", follow=True) 25 | self.assertEqual(response_sbom.status_code, 200) 26 | 27 | def test_vendor_page(self): 28 | response_vendor = self.client.get("/vendorscorecard", follow=True) 29 | self.assertEqual(response_vendor.status_code, 200) 30 | 31 | def test_admin_page(self): 32 | response_admin = self.client.get("/admin", follow=True) 33 | self.assertEqual(response_admin.status_code, 200) 34 | -------------------------------------------------------------------------------- /apps/grading/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/grading/__init__.py -------------------------------------------------------------------------------- /apps/grading/admin.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from django.contrib import admin 6 | 7 | from .models import GradeThresholds, GradeWeights 8 | 9 | 10 | @admin.register(GradeWeights) 11 | class GradingWeightsAdmin(admin.ModelAdmin): 12 | list_display = ["crit_weight", "high_weight", "medium_weight", "low_weight"] 13 | 14 | def has_add_permission(self, request): 15 | return ( 16 | False 17 | if self.model.objects.count() > 0 18 | else super().has_add_permission(request) 19 | ) 20 | 21 | 22 | @admin.register(GradeThresholds) 23 | class GradingThresholdsAdmin(admin.ModelAdmin): 24 | fields = ( 25 | "less_than_threshold_grade_A", 26 | ("greater_eq_threshold_grade_B", "less_than_threshold_grade_B"), 27 | ("greater_eq_threshold_grade_C", "less_than_threshold_grade_C"), 28 | ("greater_eq_threshold_grade_D", "less_than_threshold_grade_D"), 29 | "greater_eq_threshold_grade_F", 30 | ) 31 | list_display = [ 32 | "less_than_threshold_grade_A", 33 | "greater_eq_threshold_grade_B", 34 | "less_than_threshold_grade_B", 35 | "greater_eq_threshold_grade_C", 36 | "less_than_threshold_grade_C", 37 | "greater_eq_threshold_grade_D", 38 | "less_than_threshold_grade_D", 39 | "greater_eq_threshold_grade_F", 40 | ] 41 | 42 | def has_add_permission(self, request): 43 | return ( 44 | False 45 | if self.model.objects.count() > 0 46 | else super().has_add_permission(request) 47 | ) 48 | -------------------------------------------------------------------------------- /apps/grading/apps.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | from django.apps import AppConfig 6 | 7 | 8 | class GradingConfig(AppConfig): 9 | default_auto_field = "django.db.models.BigAutoField" 10 | name = "apps.grading" 11 | -------------------------------------------------------------------------------- /apps/grading/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/grading/migrations/__init__.py -------------------------------------------------------------------------------- /apps/grading/tests.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | # Create your tests here. 6 | -------------------------------------------------------------------------------- /apps/grading/views.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | # Create your views here. 6 | -------------------------------------------------------------------------------- /apps/sbomscanner/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/sbomscanner/__init__.py -------------------------------------------------------------------------------- /apps/sbomscanner/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class SbomscannerConfig(AppConfig): 5 | default_auto_field = "django.db.models.BigAutoField" 6 | name = "apps.sbomscanner" 7 | -------------------------------------------------------------------------------- /apps/sbomscanner/cyclonedxtospdx: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## Converts cycloneDx to SPDX 4 | ## Script gets called by sbom_process.py 5 | 6 | # wdir=/var/www/Daggerboard/uploads/sbom/ 7 | # archive=/var/www/sbomscripts/archive_spdx 8 | 9 | wdir=/uploads/sbom 10 | archive=/archive_spdx 11 | 12 | cd $wdir 13 | 14 | for f in $(ls *.xml) 15 | do 16 | spdx_f=${f%.xml}.spdx 17 | spdx_f=${spdx_f// /_} 18 | cp /dev/null ${spdx_f} 19 | echo 'SPDXVersion: SPDX-2.2' >> $spdx_f 20 | echo 'SPDXID: SPDXRef-DOCUMENT' >> $spdx_f 21 | echo "DocumentName: ${f%.xml}" >> $spdx_f 22 | echo >> $spdx_f 23 | 24 | cat $f | grep -i -A2 'component type="library"' | egrep -v 'component type="library"|\-\-' | \ 25 | perl -pe 's/\n/|/' | sed "s/<\/version>/<\/version>XXXXX/g" | sed 's/XXXXX/\n/g' | \ 26 | sed 's/^|//g' | tr -d '[:blank:]' | \ 27 | while read line 28 | do 29 | pn=$(echo $line | cut -d'|' -f1 | sed -n 's:.*\(.*\).*:\1:p') 30 | pv=$(echo $line | cut -d'|' -f2 | sed -n 's:.*\(.*\).*:\1:p') 31 | 32 | echo "PackageName: $pn" 33 | echo "PackageVersion: $pv" 34 | echo 35 | done >> $spdx_f 36 | chown www-data: $spdx_f 37 | mv -f $f $archive 38 | converted="$converted $f" 39 | done 40 | 41 | if [[ "X$converted" != "X" ]]; then 42 | echo "CycloneDX converted: $converted" 43 | fi -------------------------------------------------------------------------------- /apps/sbomscanner/exploitdb_lookup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## Script searches in exploitdb for any exploit by CVE 4 | 5 | exploitdb="https://www.exploit-db.com" 6 | 7 | if [ $# -ne 1 ]; then 8 | exit 1 9 | fi 10 | cve=$(echo $1 | tr -d '\n') 11 | 12 | if [ -z $cve ]; then 13 | exit 1 14 | fi 15 | 16 | exploit_id=$(curl -s -k -X $'GET' -H $'Accept: application/json' \ 17 | -H $'X-Requested-With: XMLHttpRequest' $exploitdb/search?cve=$cve | \ 18 | python3 -m json.tool | grep exploit_id | uniq -i | cut -d':' -f2 | \ 19 | tr -d ',"' | xargs | tr ' ' '\n' | sort -u |tr '\n' ' ' ) 20 | 21 | for i in $exploit_id 22 | do 23 | if [ -z $i ]; then 24 | exit 1 25 | else 26 | echo "$exploitdb/exploits/$i" 27 | fi 28 | done -------------------------------------------------------------------------------- /apps/sbomscanner/get_nvd_data_feed: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Check if the correct number of arguments is provided 4 | if [ "$#" -ne 2 ]; then 5 | echo "Usage: $0 " 6 | exit 1 7 | fi 8 | 9 | # Assign arguments to variables 10 | filepath=$1 11 | app_user=$2 12 | 13 | baseurl="https://nvd.nist.gov/feeds/json/cve/1.1" 14 | nvd_feed_mod="$baseurl/nvdcve-1.1-modified.json.gz" 15 | nvd_feed_recent="$baseurl/nvdcve-1.1-recent.json.gz" 16 | cpe_dict="https://nvd.nist.gov/feeds/xml/cpe/dictionary/official-cpe-dictionary_v2.3.xml.gz" 17 | 18 | cd "$filepath/nvdrepo" || exit 19 | 20 | curl -O $nvd_feed_mod 21 | curl -O $nvd_feed_recent 22 | curl -O $cpe_dict 23 | 24 | cur_year=$(date +%Y | xargs) 25 | for (( y=2002; y<=$cur_year; y++ )) 26 | do 27 | curl -O $baseurl/nvdcve-1.1-${y}.json.gz 28 | done 29 | 30 | for f in *.gz 31 | do 32 | gunzip -f "$f" 33 | done 34 | 35 | rm -f *.gz* 36 | 37 | ## dumpcpedict 38 | cpedict=official-cpe-dictionary_v2.3.xml 39 | 40 | egrep -i "//g' -e 's/<\/title>//g' -e 's/\/>//g' | \ 42 | tr -d '">|' | egrep -iv "http|https" | python3 "$filepath/process_cpedict.py" > nvdcpedict.csv 43 | 44 | chown "$app_user:" nvdcpedict.csv 45 | 46 | ## dumpcvecpe 47 | for f in nvdcve-1.1-20*.json nvdcve-1.1-recent.json nvdcve-1.1-modified.json 48 | do 49 | cat "$f" | python3 "$filepath/process_cvecpe.py" 50 | 51 | done > nvdcvecpe.csv 52 | 53 | chown "$app_user:" nvdcvecpe.csv 54 | 55 | exit 0 -------------------------------------------------------------------------------- /apps/sbomscanner/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.13 on 2024-09-17 04:17 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='DaggerBoardAPI', 16 | fields=[ 17 | ('id', models.AutoField(primary_key=True, serialize=False)), 18 | ('documentname', models.CharField(max_length=200)), 19 | ('vendorname', models.CharField(max_length=100)), 20 | ('critical_risk_count', models.IntegerField()), 21 | ('high_risk_count', models.IntegerField()), 22 | ('medium_risk_count', models.IntegerField()), 23 | ('low_risk_count', models.IntegerField()), 24 | ('risk_grade', models.TextField()), 25 | ('created_at', models.DateTimeField(auto_now=True)), 26 | ], 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /apps/sbomscanner/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/apps/sbomscanner/migrations/__init__.py -------------------------------------------------------------------------------- /apps/sbomscanner/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class DaggerBoardAPI(models.Model): 5 | """ 6 | Model for holding data specific to SBOMs uploaded. 7 | """ 8 | 9 | id = models.AutoField(primary_key=True) 10 | documentname = models.CharField(max_length=200) 11 | vendorname = models.CharField(max_length=100) 12 | critical_risk_count = models.IntegerField() 13 | high_risk_count = models.IntegerField() 14 | medium_risk_count = models.IntegerField() 15 | low_risk_count = models.IntegerField() 16 | risk_grade = models.TextField() 17 | created_at = models.DateTimeField(auto_now=True) 18 | 19 | def __str__(self) -> str: 20 | return f"{self.documentname}" 21 | -------------------------------------------------------------------------------- /apps/sbomscanner/packages/cyclonedx_to_spdx/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | from xml.etree import ElementTree as ET 3 | 4 | 5 | class XmlToSpdxConverter: 6 | def __init__(self, upload_dir, archive): 7 | self.upload_dir = upload_dir 8 | self.archive = archive 9 | 10 | def convert(self): 11 | for filename in os.listdir(self.upload_dir): 12 | if filename.endswith(".xml"): 13 | spdx_f = filename.replace(".xml", ".spdx").replace(" ", "_") 14 | spdx_f_path = os.path.join(self.upload_dir, spdx_f) 15 | 16 | with open(spdx_f_path, "w") as f: 17 | f.write("SPDXVersion: SPDX-2.2\n") 18 | f.write("SPDXID: SPDXRef-DOCUMENT\n") 19 | f.write(f'DocumentName: {filename.replace(".xml", "")}\n\n') 20 | 21 | tree = ET.parse(os.path.join(self.upload_dir, filename)) 22 | root = tree.getroot() 23 | 24 | for component in root.findall( 25 | ".//{http://cyclonedx.org/schema/bom/1.3}component" 26 | ): 27 | if component.get("type") == "library": 28 | name = component.find( 29 | "{http://cyclonedx.org/schema/bom/1.3}name" 30 | ).text 31 | version = component.find( 32 | "{http://cyclonedx.org/schema/bom/1.3}version" 33 | ).text 34 | 35 | with open(spdx_f_path, "a") as f: 36 | f.write(f"PackageName: {name}\n") 37 | f.write(f"PackageVersion: {version}\n\n") 38 | 39 | return spdx_f_path 40 | -------------------------------------------------------------------------------- /apps/sbomscanner/packages/exploitdb_lookup/__init__.py: -------------------------------------------------------------------------------- 1 | import json 2 | import logging 3 | 4 | import requests 5 | 6 | 7 | class ExploitDBLookup: 8 | def __init__(self): 9 | self.proxysrv = "" 10 | self.exploitdb = "https://www.exploit-db.com" 11 | 12 | def get_exploitdb_links(self, cve): 13 | if not cve or cve == "na": 14 | return [] 15 | 16 | headers = { 17 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", 18 | "Accept": "application/json", 19 | "X-Requested-With": "XMLHttpRequest", 20 | } 21 | 22 | response = requests.get( 23 | f"{self.exploitdb}/search?cve={cve}", 24 | headers=headers, 25 | proxies={"http": self.proxysrv, "https": self.proxysrv}, 26 | ) 27 | 28 | if response.text: 29 | response_json = json.loads(response.text) 30 | exploit_ids = [ 31 | item.get("id") for item in response_json["data"] if "id" in item 32 | ] 33 | exploit_ids = list(set(exploit_ids)) 34 | 35 | links = [ 36 | f"{self.exploitdb}/exploits/{exploit_id}" for exploit_id in exploit_ids 37 | ] 38 | return links 39 | else: 40 | logging.info("No data returned from the request") 41 | return [] 42 | -------------------------------------------------------------------------------- /apps/sbomscanner/packages/file_hasher/__init__.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | 3 | 4 | class FileHasher: 5 | @staticmethod 6 | def calculate_hash(target_file): 7 | """Calculates and returns the SHA-1 hash of a file""" 8 | BUFFER_SIZE = 65536 9 | sha1_hasher = hashlib.sha1() 10 | with open(target_file, "rb") as file_to_hash: 11 | data_chunk = file_to_hash.read(BUFFER_SIZE) 12 | while len(data_chunk) > 0: 13 | sha1_hasher.update(data_chunk) 14 | data_chunk = file_to_hash.read(BUFFER_SIZE) 15 | return sha1_hasher.hexdigest() 16 | -------------------------------------------------------------------------------- /apps/sbomscanner/process_cpedict.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | def process_input(input_stream): 4 | for line in input_stream: 5 | if "cpe" not in line: 6 | sys.stdout.write(line.replace("\n", "|")) 7 | else: 8 | sys.stdout.write(line) 9 | 10 | if __name__ == "__main__": 11 | process_input(sys.stdin) -------------------------------------------------------------------------------- /apps/sbomscanner/process_cvecpe.py: -------------------------------------------------------------------------------- 1 | import json 2 | import sys 3 | 4 | def process_input(input_stream): 5 | obj = json.load(input_stream) 6 | for o in obj["CVE_Items"]: 7 | cve = o["cve"]["CVE_data_meta"]["ID"] 8 | description = o["cve"]["description"]["description_data"][0]["value"].replace("\r", "").replace("\n", "") 9 | if "baseMetricV3" in o["impact"]: 10 | baseSeverity23 = o["impact"]["baseMetricV3"]["cvssV3"]["baseSeverity"] 11 | baseScore23 = o["impact"]["baseMetricV3"]["cvssV3"]["baseScore"] 12 | vectorString3 = o["impact"]["baseMetricV3"]["cvssV3"]["vectorString"] 13 | else: 14 | if "baseMetricV2" in o["impact"]: 15 | baseSeverity23 = o["impact"]["baseMetricV2"]["severity"] 16 | baseScore23 = o["impact"]["baseMetricV2"]["cvssV2"]["baseScore"] 17 | vectorString3 = o["impact"]["baseMetricV2"]["cvssV2"]["vectorString"] 18 | baseScore23 = (baseScore23 * 30 / 100) + baseScore23 19 | baseScore23 = round(baseScore23, 1) 20 | vectorString3 = "na" 21 | if baseScore23 > 0 and baseScore23 <= 3.9: 22 | baseSeverity23 = "LOW" 23 | if baseScore23 >= 4 and baseScore23 <= 6.9: 24 | baseSeverity23 = "MEDIUM" 25 | if baseScore23 >= 7 and baseScore23 <= 8: 26 | baseSeverity23 = "HIGH" 27 | if baseScore23 >= 9 and baseScore23 <= 10: 28 | baseSeverity23 = "CRITICAL" 29 | if baseScore23 > 10: 30 | baseSeverity23 = "CRITICAL" 31 | baseScore23 = 10 32 | else: 33 | baseSeverity23 = "na" 34 | baseScore23 = "na" 35 | vectorString3 = "na" 36 | sys.stdout.write("|".join((cve, description, str(baseScore23), baseSeverity23, vectorString3)).strip() + "|") 37 | for i in o["configurations"]["nodes"]: 38 | for l in i["children"]: 39 | for r in l["cpe_match"]: 40 | sys.stdout.write(r["cpe23Uri"].strip() + ",") 41 | for n in i["cpe_match"]: 42 | sys.stdout.write(n["cpe23Uri"].strip() + ",") 43 | sys.stdout.write("\n") 44 | 45 | if __name__ == "__main__": 46 | process_input(sys.stdin) -------------------------------------------------------------------------------- /apps/sbomscanner/proxystatus: -------------------------------------------------------------------------------- 1 | 2023-06-22 23:28:15: NVD_REACHABLE 2 | -------------------------------------------------------------------------------- /apps/sbomscanner/reset_nvd_db: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## This script will force the script get_cve_cpe.py 4 | ## to pull CVEs and CPEs created from year 2002 5 | 6 | hdir=/var/www/sbomscripts 7 | PYTHON=/var/www/Daggerboard/venv/bin/python 8 | envvar="/var/www/Daggerboard/daggerboardproject/.env" 9 | last_nvd_update=$hdir/last_nvd_update 10 | db_nvd=$hdir/nvdrepo/nvdcvecpe.csv 11 | db_nvd_tmp=$hdir/nvdrepo/nvdcvecpe.csv_tmp 12 | nvdurl="https://services.nvd.nist.gov/rest/json/cves/2.0?resultsPerPage=1" 13 | proxysrv=$(grep PROXY $envvar | cut -d= -f2 | tr -d "'" | tr -d '"') 14 | cve_records=$(curl -k --connect-timeout 10 -s -x "$proxysrv" "$nvdurl" | $PYTHON -m json.tool | grep total | cut -d':' -f2 | tr -d ',' | xargs) 15 | 16 | ## Setting default CVE number of records 17 | if ! [[ "$cve_records" =~ ^[0-9]+$ ]]; then 18 | echo "not integer" 19 | cve_records=210000 20 | fi 21 | 22 | today=$(date +%Y-%m-%d) 23 | pid_file_date=$(stat $hdir/get_nvd_cve_cpe.pid | grep Modify | awk '{print $2}') 24 | pid_file=$hdir/get_nvd_cve_cpe.pid 25 | 26 | ## make sure no data is being written before resetting the last_nvd_update 27 | if [ ! -f $db_nvd_tmp ]; then 28 | ## Reset last_nvd_update 29 | if [ $(cat $db_nvd | wc -l) -lt $cve_records ]; then 30 | echo "LAST_UPDATE=2002-01-01 00:00:01" > $last_nvd_update 31 | fi 32 | fi 33 | 34 | ## rm pidfile if CVE collecting script got stuck for some unpredictable reason 35 | if [[ "$pid_file_date" != "$today" ]];then 36 | rm -f $pid_file 37 | fi 38 | 39 | 40 | ## Maintain db copies 41 | find $hdir/nvdrepo -name "nvdcvecpe.csv_$(date +%Y)*" -mtime +7 -exec rm \{\} \; 42 | 43 | exit 0 44 | -------------------------------------------------------------------------------- /apps/sbomscanner/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from .models import DaggerBoardAPI 4 | 5 | 6 | class SbomSerializer(serializers.ModelSerializer): 7 | class Meta: 8 | model = DaggerBoardAPI 9 | fields = "__all__" 10 | -------------------------------------------------------------------------------- /apps/sbomscanner/tasks.py: -------------------------------------------------------------------------------- 1 | # Create your tasks here 2 | 3 | from celery import shared_task 4 | from celery.utils.log import get_task_logger 5 | 6 | from apps.sbomscanner.models import DaggerBoardAPI 7 | from apps.sbomscanner.sbom_process import SbomScanner 8 | 9 | logger = get_task_logger(__name__) 10 | 11 | 12 | @shared_task 13 | def run_sbomscanner(sbom_file_path): 14 | sbomscanner = SbomScanner() 15 | results = sbomscanner.main() 16 | model = DaggerBoardAPI.objects.create( 17 | documentname=results.get("daggerboard_scorecard") 18 | .query_data[0] 19 | .get("documentname"), 20 | vendorname=results.get("daggerboard_scorecard").query_data[0].get("vendorname"), 21 | critical_risk_count=results.get("daggerboard_scorecard") 22 | .query_data[0] 23 | .get("cve_crit"), 24 | high_risk_count=results.get("daggerboard_scorecard") 25 | .query_data[0] 26 | .get("cve_high"), 27 | medium_risk_count=results.get("daggerboard_scorecard") 28 | .query_data[0] 29 | .get("cve_med"), 30 | low_risk_count=results.get("daggerboard_scorecard") 31 | .query_data[0] 32 | .get("cve_low"), 33 | risk_grade=results.get("daggerboard_scorecard").sbomsummary_table.get( 34 | "letter_grade" 35 | ), 36 | ) 37 | return model.id 38 | -------------------------------------------------------------------------------- /contributing/bug_template.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | Bug Report Template 8 | --- 9 | name: Name of Bug Report 10 | 11 | description: Short description of the bug 12 | 13 | ### Description 14 | 15 | 16 | 17 | ### Steps to Reproduce 18 | 19 | 1. 20 | 2. 21 | 3. 22 | 23 | **Expected behavior:** 24 | 25 | 26 | 27 | **Actual behavior:** 28 | 29 | 30 | 31 | ### Additional Information 32 | 33 | 34 | -------------------------------------------------------------------------------- /daggerboardproject/__init__.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import, unicode_literals 2 | 3 | # This will make sure the app is always imported when 4 | # Django starts so that shared_task will use this app. 5 | from .settings.celery import app as celery_app 6 | 7 | __all__ = ("celery_app",) 8 | -------------------------------------------------------------------------------- /daggerboardproject/asgi.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | """ 6 | ASGI config for daggerboardproject project. 7 | 8 | It exposes the ASGI callable as a module-level variable named ``application``. 9 | 10 | For more information on this file, see 11 | https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ 12 | """ 13 | 14 | import os 15 | 16 | from django.core.asgi import get_asgi_application 17 | 18 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'daggerboardproject.settings') 19 | 20 | application = get_asgi_application() 21 | -------------------------------------------------------------------------------- /daggerboardproject/settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/daggerboardproject/settings/__init__.py -------------------------------------------------------------------------------- /daggerboardproject/settings/base.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/daggerboardproject/settings/base.py -------------------------------------------------------------------------------- /daggerboardproject/settings/celery.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from celery import Celery 4 | 5 | # Get the environment from the environment variable or default to 'local_development' 6 | env = os.getenv("DJANGO_ENV", "development") 7 | 8 | # Set the default Django settings module for the 'celery' program. 9 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", f"daggerboardproject.settings.{env}") 10 | 11 | app = Celery("daggerboardproject") 12 | 13 | # Using a string here means the worker doesn't have to serialize 14 | # the configuration object to child processes. 15 | # - namespace='CELERY' means all celery-related configuration keys 16 | # should have a `CELERY_` prefix. 17 | app.config_from_object("django.conf:settings", namespace="CELERY") 18 | 19 | # Load task modules from all registered Django apps. 20 | app.autodiscover_tasks() 21 | -------------------------------------------------------------------------------- /daggerboardproject/settings/production.py: -------------------------------------------------------------------------------- 1 | # Configuration settings for production environment -------------------------------------------------------------------------------- /daggerboardproject/urls.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | """daggerboard URL Configuration 6 | 7 | The `urlpatterns` list routes URLs to views. For more information please see: 8 | https://docs.djangoproject.com/en/3.2/topics/http/urls/ 9 | Examples: 10 | Function views 11 | 1. Add an import: from my_app import views 12 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 13 | Class-based views 14 | 1. Add an import: from other_app.views import Home 15 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 16 | Including another URLconf 17 | 1. Import the include() function: from django.urls import include, path 18 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 19 | """ 20 | from django.contrib import admin 21 | from django.urls import include, path 22 | 23 | from apps.daggerboard_ui.views import (APILoginView, error_400, error_403, 24 | error_404, error_500, genreport, 25 | home_view, login_view, logout_view, 26 | sbomscorecard, upload_status, 27 | uploadProgressChk, vendorscorecard) 28 | from apps.sbomscanner.views import DaggerBoardAPIView 29 | 30 | urlpatterns = [ 31 | path("admin/", admin.site.urls), 32 | path("login/", login_view, name="login"), 33 | path("logout/", logout_view, name="logout"), 34 | path("", home_view, name="home"), 35 | path("vendorscorecard/", vendorscorecard, name="vendor_scorecard"), 36 | path("sbomscorecard/", sbomscorecard, name="sbom_scorecard"), 37 | path("genreport/", genreport, name="genreport"), 38 | path("uploadstatus/", uploadProgressChk.as_view(), name="mjob_status"), 39 | path("sbomuploadstatus/", upload_status, name="upload_status"), 40 | path("django-rq/", include("django_rq.urls")), 41 | path("api/sbom/", DaggerBoardAPIView.as_view(), name="daggerboard_api"), 42 | path( 43 | "api/sbom//", 44 | DaggerBoardAPIView.as_view(), 45 | name="daggerboard_api_with_id", 46 | ), 47 | path("api/login/", APILoginView.as_view(), name="daggerboard_api_login"), 48 | ] 49 | 50 | handler404 = error_404 51 | handler500 = error_500 52 | handler403 = error_403 53 | handler400 = error_400 54 | 55 | admin.site.site_header = "DaggerBoard Admin" 56 | admin.site.site_title = "DaggerBoard Admin Portal" 57 | admin.site.index_title = "Welcome to DaggerBoard Admin Portal" 58 | -------------------------------------------------------------------------------- /daggerboardproject/wsgi.py: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | """ 6 | WSGI config for daggerboardproject project. 7 | 8 | It exposes the WSGI callable as a module-level variable named ``application``. 9 | 10 | For more information on this file, see 11 | https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ 12 | """ 13 | 14 | import os 15 | 16 | from django.core.wsgi import get_wsgi_application 17 | from dotenv import load_dotenv 18 | 19 | dotenv_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), ".env") 20 | load_dotenv(dotenv_path) 21 | 22 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", os.getenv("DJANGO_SETTINGS_MODULE")) 23 | 24 | application = get_wsgi_application() 25 | -------------------------------------------------------------------------------- /install.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nyph-infosec/daggerboard/f53f0e8508adbd819a593ffdc96f2a7211539230/install.log -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # SPDX-FileCopyrightText: 2022 NewYork-Presbyterian Hospital 4 | # 5 | # SPDX-License-Identifier: MIT 6 | 7 | """Django's command-line utility for administrative tasks.""" 8 | import os 9 | import sys 10 | 11 | 12 | def main(): 13 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "daggerboardproject.settings.development") 14 | try: 15 | from django.core.management import execute_from_command_line 16 | except ImportError as exc: 17 | raise ImportError( 18 | "Couldn't import Django. Are you sure it's installed and " 19 | "available on your PYTHONPATH environment variable? Did you " 20 | "forget to activate a virtual environment?" 21 | ) from exc 22 | execute_from_command_line(sys.argv) 23 | 24 | 25 | if __name__ == "__main__": 26 | main() 27 | -------------------------------------------------------------------------------- /meta/.reuse/dep5: -------------------------------------------------------------------------------- 1 | Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Upstream-Name: 3 | Upstream-Contact: 4 | Source: 5 | 6 | Files: daggerboard/static/js/bootstrap/* daggerboard/static/scss/bootstrap/* daggerboard/static/js/bootstrap* daggerboard/static/js/tab.js daggerboard/static/CACHE/css/bootstrap* 7 | Copyright: 2011-2022 Twitter, Inc. 8 | Copyright: 2011-2022 The Bootstrap Authors 9 | License: MIT 10 | 11 | 12 | Files: daggerboard/static/admin/* 13 | Copyright: 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors 14 | License: MIT 15 | 16 | Files: daggerboard/static/js/chart.js daggerboard/static/js/Chart.bundle.js 17 | Copyright: 2014-2022 Chart.js Contributors 18 | License: MIT 19 | 20 | Files: daggerboard/static/js/jquery* daggerboard/static/css/jquery* 21 | Copyright: 2022 OpenJS Foundation and jQuery contributors 22 | License: MIT 23 | 24 | Files: daggerboard/static/css/slimselect.css daggerboard/static/js/slimselect.js 25 | Copyright: 2017 Brian Voelker 26 | License: MIT 27 | 28 | Files: daggerboard/static/images/* .attachments/readme_db_diagram.png daggerboard/static/daggerboard* daggerboardproject/.env daggerboard/templates/* 29 | Copyright: 2022 NewYork-Presbyterian Hospital 30 | License: MIT 31 | 32 | Files: daggerboard/static/fonts/BebasNeue-Regular.ttf 33 | Copyright: 2010 by Dharma Type 34 | License: OFL-1.1 35 | 36 | Files: daggerboard/static/fonts/SourceSansPro* daggerboard/static/fonts/OFL.txt 37 | Copyright: 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’ 38 | License: OFL-1.1 -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 NewYork-Presbyterian Hospital 2 | # 3 | # SPDX-License-Identifier: MIT 4 | 5 | amqp==5.2.0 6 | asgiref>=3.4.1 7 | attrs==23.2.0 8 | beautifulsoup4==4.10.0 9 | billiard==4.2.0 10 | black==24.4.0 11 | celery==5.3.6 12 | certifi==2021.5.30 13 | cfgv==3.4.0 14 | charset-normalizer==2.0.6 15 | click==8.1.7 16 | click-didyoumean==0.3.1 17 | click-plugins==1.1.1 18 | click-repl==0.3.0 19 | colorama==0.4.6 20 | Deprecated==1.2.14 21 | distlib==0.3.8 22 | Django==3.2.13 23 | django-appconf==1.0.4 24 | django-auth-ldap==3.0.0 25 | django-compressor==2.4.1 26 | django-cors-headers==3.11.0 27 | django-csp==3.7 28 | django-env==0.2.1 29 | django-environ==0.8.1 30 | django-libsass==0.9 31 | django-rq==2.10.2 32 | djangorestframework==3.15.1 33 | exceptiongroup==1.2.0 34 | filelock==3.14.0 35 | flake8==7.0.0 36 | identify==2.5.36 37 | idna==3.2 38 | iniconfig==2.0.0 39 | isort==5.13.2 40 | kombu==5.3.6 41 | libsass==0.21.0 42 | lxml==4.9.2 43 | mando==0.7.1 44 | mccabe==0.7.0 45 | mypy-extensions==1.0.0 46 | nodeenv==1.8.0 47 | numpy==1.21.3 48 | packaging==24.0 49 | pandas==1.3.4 50 | pathspec==0.12.1 51 | pdfkit==1.0.0 52 | pillow==10.2.0 53 | platformdirs==4.2.0 54 | pluggy==1.4.0 55 | pre-commit 56 | prompt-toolkit==3.0.43 57 | py==1.11.0 58 | pyaes==1.6.1 59 | pyasn1==0.6.0 60 | pyasn1_modules==0.4.0 61 | pycodestyle==2.11.1 62 | pyflakes==3.2.0 63 | pytest==6.2.5 64 | pytest-pythonpath==0.7.4 65 | python-dateutil==2.8.2 66 | python-dotenv==1.0.1 67 | python-ldap==3.4.4 68 | pytz==2021.1 69 | PyYAML==6.0.1 70 | radon==6.0.1 71 | rcssmin==1.0.6 72 | reportlab==3.6.5 73 | requests==2.26.0 74 | rjsmin==1.1.0 75 | rq==1.16.1 76 | six==1.16.0 77 | soupsieve==2.3 78 | SQLAlchemy==2.0.29 79 | sqlparse==0.4.2 80 | toml==0.10.2 81 | tomli==2.0.1 82 | typing_extensions==4.11.0 83 | tzdata==2024.1 84 | urllib3==1.26.7 85 | vine==5.1.0 86 | virtualenv==20.26.2 87 | wcwidth==0.2.13 88 | wrapt==1.16.0 -------------------------------------------------------------------------------- /utils/migrations_check.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | check_result=`python manage.py makemigrations --check --dry-run` 3 | echo $check_result 4 | if [ "$check_result" == "No changes detected" ] 5 | then 6 | echo "Migrations are up to date." 7 | exit 0 8 | else 9 | echo "Changes requiring migrations detected." 10 | exit 1 11 | fi 12 | -------------------------------------------------------------------------------- /utils/reset_nvd_db.py: -------------------------------------------------------------------------------- 1 | import json 2 | import logging 3 | import os 4 | from datetime import datetime 5 | 6 | import requests 7 | 8 | hdir = "daggerboard/nvdrepo" 9 | db_nvd = os.path.join("daggerboard", "nvdrepo", "nvdcvecpe.csv") 10 | db_nvd_tmp = os.path.join("daggerboard", "nvdrepo", "nvdcvecpe.csv_tmp") 11 | nvdurl = "https://services.nvd.nist.gov/rest/json/cves/2.0?resultsPerPage=1" 12 | pid_file = "get_nvd_cve_cpe.pid" 13 | proxysrv = "" 14 | today = datetime.now().strftime("%Y-%m-%d") 15 | 16 | 17 | try: 18 | response = requests.get( 19 | nvdurl, proxies={"http": proxysrv, "https": proxysrv}, timeout=10 20 | ) 21 | cve_records = json.loads(response.text)["totalResults"] 22 | except Exception as e: 23 | logging.info(e) 24 | cve_records = 210000 25 | 26 | 27 | if not os.path.isfile(db_nvd_tmp): 28 | with open(db_nvd, "r") as f: 29 | lines = f.readlines() 30 | if len(lines) < cve_records: 31 | with open("last_nvd_update", "w") as f: 32 | f.write("LAST_UPDATE=2002-01-01 00:00:01") 33 | 34 | pid_file_date = datetime.fromtimestamp(os.path.getmtime(pid_file)).strftime("%Y-%m-%d") 35 | 36 | if pid_file_date != today: 37 | os.remove(pid_file) 38 | 39 | old_files = [ 40 | f 41 | for f in os.listdir(os.path.join("daggerboard", "nvdrepo")) 42 | if f.startswith("nvdcvecpe.csv_") and f.endswith(datetime.now().strftime("%Y")) 43 | ] 44 | for old_file in old_files: 45 | os.remove(os.path.join(hdir, "nvdrepo", old_file)) 46 | --------------------------------------------------------------------------------
{{ message }}