From ea265278ead6c72e543054077157ba8d119b2466 Mon Sep 17 00:00:00 2001 From: Matthias Koenig Date: Thu, 10 Oct 2019 11:15:00 +0200 Subject: [PATCH 01/19] version bump for develop --- backend/pkdb_app/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/pkdb_app/_version.py b/backend/pkdb_app/_version.py index 79e30d3c..8bc6a451 100644 --- a/backend/pkdb_app/_version.py +++ b/backend/pkdb_app/_version.py @@ -1,4 +1,4 @@ """ Definition of version string. """ -__version__ = "0.6.7" +__version__ = "0.6.8a1" From c09c96721339721d35095bd329fc17d6ad04719e Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Thu, 10 Oct 2019 11:28:06 +0200 Subject: [PATCH 02/19] closes #413 --- backend/pkdb_app/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/pkdb_app/serializers.py b/backend/pkdb_app/serializers.py index a3f9666d..0271eed7 100644 --- a/backend/pkdb_app/serializers.py +++ b/backend/pkdb_app/serializers.py @@ -161,7 +161,7 @@ def number_of_entries(self, entry): @staticmethod def interventions_from_string(value): if value: - return [v.strip() for v in value.split(",")] + return [v.strip() for v in str(value).split(",")] else: return value From ced47a6afddd882171f85511da683cc4edf1ede3 Mon Sep 17 00:00:00 2001 From: Matthias Koenig Date: Fri, 11 Oct 2019 11:59:39 +0200 Subject: [PATCH 03/19] removal curation information --- CURATION.md | 401 -------------------------- backend/pkdb_app/serializers.py | 2 +- docs/curation/curation_files.png | Bin 45039 -> 0 bytes docs/curation/figure_digitization.png | Bin 425814 -> 0 bytes docs/curation/watch_study.png | Bin 91794 -> 0 bytes frontend/src/components/Curation.vue | 2 +- 6 files changed, 2 insertions(+), 403 deletions(-) delete mode 100644 CURATION.md delete mode 100644 docs/curation/curation_files.png delete mode 100644 docs/curation/figure_digitization.png delete mode 100644 docs/curation/watch_study.png diff --git a/CURATION.md b/CURATION.md deleted file mode 100644 index e84f837a..00000000 --- a/CURATION.md +++ /dev/null @@ -1,401 +0,0 @@ -# Curation of pharmacokinetics studies for PK-DB - -This document provides resources and information on how to curate data and information -from pharmacokinetics studies for the PK-DB database. - -Available choices for important fields are available from the PK-DB frontend -https://develop.pk-db.com/#/curation - -If things are unclear during curation or you find incorrect or missing information in -this document please open an issue at -https://github.com/matthiaskoenig/pkdb/issues -with the label `data curation`. - - -## Interactive curation - -All information of a single study is stored in one folder. The complete information can be uploaded -and iteratively curated using the provided `watch_study` script. The script uploads -the latest data on file changes therefore allowing rapid iteration of curation and -validation. Information on how to setup the `watch_study` script is provided -in https://github.com/matthiaskoenig/pkdb_data - -As initial setup create a virtual environment with `pkdb_data` installed. -``` -git clone https://github.com/matthiaskoenig/pkdb_data.git -cd pkdb_data -mkvirtualenv pkdb_data --python=python3.6 -pip install -e . -``` -Next step is to export your credentials via environment variables. -Therefore, create a `.env` file by coping `env.template`. -``` -cp .env.template .env -``` -and update the the `USER` and `PASSWORD` in the `.env`. -``` -API_BASE=https://develop.pk-db.com -USER=PKDB_USERNAME -PASSWORD=PKDB_PASSWORD -``` -And export the variables via -``` -set -a && source .env -``` -To check the environment variables use -``` -echo $API_BASE -echo $USER -echo $PASSWORD -``` - -To watch a given study use -``` -# activate virtualenv with watch_study script -workon pkdb_data - -# export environment variables for backend -(pkdb_data) set -a && source .env - -# run the watch script -(pkdb_data) watch_study -s $STUDYFOLDER -``` - -Here the example output for the successfully uploaded study `Renner2007`. On file changes the study will be reuploaded -![Interactive curation with watch_study](./docs/curation/watch_study.png "Interactive curation with watch_study") - -## 1. PDF, Reference, Figures & Tables - -For upload a certain folder structure and organisation is expected of the `$STUDYFOLDER`. -The first step is to create the folder and the basic files in the folder - -- folder name is `STUDYNAME`, e.g., `Albert1974` -- folder contains the pdf as `STUDYNAME.pdf`, e.g., `Albert1974.pdf` -- folder contains additional files associated with study, i.e., - - tables, named `STUDYNAME_Tab[1-9]*.png`, e.g., `Albert1974_Tab2.png` - - figures, named `STUDYNAME_Fig[1-9]*.png`, e.g., `Albert1974_Fig1.png` - - excel file, named `STUDYNAME.xlsx`, e.g., `Albert1974.xlsx` - -In addition the folder can contain data files, -named `STUDYNAME_Tab[1-9]*.tsv` or `STUDYNAME_Fig[1-9]*.tsv` - The information is the excel file is the primary data source, i.e., the `*.tsv` -information is redundant and not guaranteed to be maintained. - -Information about the study is stored in the `study.json` which we will create -in the following steps. Information about the reference for the study is stored -in the `reference.json` (this file is created automatically and should not be altered). - -![Overview study files](./docs/curation/curation_files.png "Overview study files") - -## 2. Initial study information (`study.json`) - -For modifying JSON files best use the `Atom` editor with the plugin `pretty-json` and activate the following -settings `Notify on Parse Error` and `Prettify on Save JSON`. - -If a `study.json` is already existing we will modify it in the following, if not -now is the time to create a new `study.json` in the `$STUDYFOLDER`. The following template JSON -contains all the relevant information - -```json -{ - "sid": 123456789, - "pkdb_version": 1.0, - "name": "Author2007", - "reference": 123456789, - "licence": "closed", - "access": "private", - "creator": "mkoenig", - "curators": [ - ["mkoenig", 0.5] - ], - "collaborators": [], - "descriptions": [], - "comments": [], - "groupset": { - "descriptions": [], - "comments": [], - "groups": [] - }, - "individualset": { - "descriptions": [], - "comments": [], - "individuals": [] - }, - "interventionset": { - "descriptions": [], - "comments": [], - "interventions": [] - }, - "outputset": { - "descriptions": [], - "comments": [], - "outputs": [], - "timecourses": [] - } -} -``` -* Fill in basic information for study, i.e., the `name` field with the `$STUDYNAME`, the `creator` and `curator` and `collaborator` fields with existing users -(creator is a single user, whereas curators is a list of users), -the `sid` and `reference` field with the `PubmedId` of the study. -* The `reference` field is optional. If no pubmed entry exist for publication a `reference.json` should be build manually (please ask what to do in such a case). -* The `access` field provides information on who can see the study. `public` provides access to everyone, `private` only to the `creator`, `curators` and `collaborators`. -* The `curators` is a list which consists of either curator names (e.g. `mkoenig`) or a curator name with a curation score between 0.0 and 5.0 (e.g. `[mkoenig, 3.5]`) -* The `licence` field provides information on the licence of the publication. This is either `open` in case of Open Access publications or `closed` otherwise. Images and the PDF are only shown publicly if the publication is Open Access. - -After this initial information is created in the `study_json` we can start running the `watch_study` script. -``` -(pkdb_data) watch_study -s $STUDYFOLDER -``` - -### Comments and descriptions -The study and all sets allow to store additional annotions either in the form of `descriptions` or `comments`. -Descriptions are quotations from the publication to substantiate and support the curated data. -`comments` provide the possibility to store information from individual curators. Examples of comments are stating incorrect units, missing data or strange conversions of data. - - -## 3. Curation of groups and individuals -### groups -The next step is the curation of the `group` information, i.e., which groups where studied. The information is stored in the `groupset` of the following form. -Retrieve group information from the publication and copy it in the description of the groupset. The top group containing all subjects must be called `all`. - -The main steps for defining groups is to set the `name` and `count` of the group (with `name` being `all` for the top-level group, or an arbitrary descriptive name -otherwise; the `count` is the number of subjects in the group. In addition to this core information a group is characterized by `characteristica`. -An overview over the available `characteristica` and possible choices is available from https://develop.pk-db.com/#/curation -```json -{ - "groupset": { - "descriptions": [ - "The subjects were six healthy volunteers, three males and three females, aged 21.0 ± 0.9 years (range 20 to 22 years) and weighing 63 ± 11 kg (range 50 to 76 kg). All were nonsmokers. Subjects abstained from all methylxanthine containing foods and beverages during the entire period of the study. Compliance with this requirement was assessed by questioning at each presentation for blood sampling or urine delivery." - ], - "comments": [], - "groups": [ - { - "count": 20, - "name": "all", - "characteristica": [ - { - "measurement_type": "species", - "choice": "homo sapiens" - }, - { - "measurement_type": "healthy", - "choice": "Y" - }, - { - "measurement_type": "overnight fast", - "choice": "Y" - }, - { - "measurement_type": "fasted", - "min": "10", - "max": "14", - "unit": "hr" - } - ] - } - ] - } -} -``` -* The groups are defined via `characteristica`, shared characteristica of groups can be defined via parent groups. -* The possible values of categorial are accessible via `pkdb_app/categorials.py`. -* The group names have to be unique within the groupset and should be descriptive, e.g., smoker, nonsmoker, contraceptive. -* All groups require a `name`, all groups with exception of `all` require `parent` field. - "parent": "string", - -All available fields for characteristica on group are: -```json -{ - "measurement_type": "categorial", - "choice": "categorial|string", - "count": "int", - "mean": "double", - "median": "double", - "min": "double", - "max": "double", - "sd": "double", - "se": "double", - "cv": "double", - "unit": "categorial" -} -``` -### individuals -Individuals are curated very similar to groups with the exception that individuals must belong -to a given group, i.e., the `group` attribute must be set. Individuals are most often defined based on spreadsheet mappings. -See for instance below individuals which are defined via a table. - -Information in the excel sheets can be referred to via using the `source` attribute stating the respective sheet (e.g. `Tab1` or `Fig2`). -The columns can then be matched via using the `col==col_header` syntax. In the example below for all the individuals the `name`, `group`, `age`, `weight` and `sex` are defined in the sheet `Tab1`. - -```json -"individuals": [ - { - "source": "Tab1", - "figure": "Tab1", - "name": "col==subject", - "group": "col==group", - "characteristica": [ - { - "measurement_type": "age", - "value": "col==age", - "unit": "yr" - }, - { - "measurement_type": "weight", - "value": "col==weight", - "unit": "kg" - }, - { - "measurement_type": "sex", - "choice": "col==sex" - } - ] - } - ] -``` -Even if individuals have no information on the characteristica, a table with individual names have to be created for later reference. - -## 4. Curation of interventions/interventionset -```json -{ - "interventionset": { - "descriptions": [], - "interventions": [ - { - "name": "glciv", - "substance": "glucose", - "route": "iv", - "form": "solution", - "application": "single dose", - "measurement_type": "dosing", - "value": "0.5", - "unit": "g/kg", - "time": "0", - "time_unit": "hr" - } - ] - } -} -``` -All available fields for intervention and interventionset are: -```json -{ - - "name": "string", - "measurement_type": "categorial", - - "substance": "categorial (substance)", - "route": "categorial {oral, iv}", - "application": "categorial {'single dose', 'multiple dose', 'continuous injection'}", - "form": "categorial {'tablete', 'capsule', ...}", - "time": "double||double||double ...", - "time_unit": "categorial", - - "choice": "categorial|string", - "value": "double", - "mean": "double", - "median": "double", - "min": "double", - "max": "double", - "sd": "double", - "se": "double", - "cv": "double", - "unit": "categorial" -} -``` -* TODO: document after next iteration - -## 5. Curation of outputs and time courses -The actual data in publication is available either from tables, figures or stated with the text. -The information is curated either as excel spreadsheets (preferred method) or can be directly stored in the `study.json` (legacy method). The actual data is hereby digitized and stored in the spreadsheets. - -- Use Excel (LibreOffice/OpenOffice) spreadsheets to store digitized data -- store as `.xlsx` format (not `.ods`) -- change language settings to use US numbers and formats, i.e. ‘.’ separator). Always use points (‘.’) as number separator, never comma (‘,’), i.e. 1.234 instead of 1,234. - -For all figures and tables from which data is extracted individual images (`png`) must be stored in the study folder, i.e., -- tables, named `STUDYNAME_Tab[1-9]*.png`, e.g., `Albert1974_Tab2.png` -- figures, named `STUDYNAME_Fig[1-9]*.png`, e.g., `Albert1974_Fig1.png` -Use the screenshot functionality in the PDF viewer and save with image program like `gimp` after removing unnecessary borders of images. - -![Overview study files](./docs/curation/curation_files.png "Overview study files") - -### Figures -- Use PlotDigitizer to digitize figures (https://sourceforge.net/projects/plotdigitizer/) - - download program - - run plotdigitizer with java -- Open the image to digitize (`STUDYNAME_Fig[1-9]*.png`) -- Use the Zoom function to increase the image if necessary (easier to click on data points) -- First axes have to be calibrated (make sure to set logarithmical axes where necessary); calibration should be done very carfully because it will have a systematic effect (bias) on all digitized data points. -- Digitize one curve at a time -- Digitize mean and error separately (the actual error can than be calculated in excel as `abs(mean-error)`) -- In case of time courses adapt the time points to the actual times reported in the publication - -![Figure digitization](./docs/curation/figure_digitization.png "Figure digitization (axes have been calibrated and first mean curve digitized)") - -Some tips for digitizion of figures: -- Check that axes are do not have any breaks or different scales (sometimes an axis is continued or not scaled equally). This will create problems in the digitization. -- use the same axes calibration for all curves in a figure, i.e., always finish all data from a single figure panel completely in one go (otherwise different bias for the different curves) -- The left lower corner is not always `(0,0)`, use the minimal x-tick an y-tick with available numerical values -- set the number of digits to a reasonable value (2-3 digits) - -### Tables -For tables the data is copied in spreadsheets. - -### Encoding outputs and time courses - -```json -{ - "source": "Tab3", - "figure": "Tab3", - "subset": "substance==paraxanthine", - "group": "healthy subjects", - "interventions": [ - "Dcaf" - ], - "substance": "paraxanthine", - "tissue": "col==tissue", - "measurement_type": "cmax || tmax || auc_inf || thalf", - "mean": "col==cmax || col==tmax || col==aucinf || col==thalf", - "sd": "col==cmax_sd || col==tmax_sd || col==aucinf_sd || col==thalf_sd", - "unit": "\u00b5g/ml || hr || \u00b5g*hr/ml || hr" - } -``` - -```json -{ - "timecourses": [ - { - "source": "Fig1", - "figure": "Fig1", - "groupby": "intervention", - "group": "all", - "interventions": "col==intervention", - "substance": "paracetamol", - "tissue": "plasma", - "measurement_type": "concentration", - "time": "col==time_min", - "time_unit": "min", - "mean": "col==apap", - "cv": "col==apap_cv", - "unit": "µg/ml" - } - ] -} -``` - - -## Units for curation -Units are crucial information to make sense out of the data set. So many `characteristica`, `interventions` and `outputs/timecourses` -require to provide unit information. -We are using a pints unit model. If units are missing or incorrect the `watch_study` script will report the -respective issues. - - - -# Frequently asked questions (FAQ) -## How to encode multiple substances which are given (e.g., caffeine and acetaminophen are given)? -- encode as individual interventions of caffeine and acetaminophen, i.e., single interventions -with the respective doses. In the outputs a list of intervention is provided, i.e., in this example the interventions for caffeine and acetaminophen - - diff --git a/backend/pkdb_app/serializers.py b/backend/pkdb_app/serializers.py index 627423aa..6fcf0c28 100644 --- a/backend/pkdb_app/serializers.py +++ b/backend/pkdb_app/serializers.py @@ -341,7 +341,7 @@ def make_entry(self, entry, template, data, source): raise serializers.ValidationError( [ - f"header key <{values[1]}> is missing in file <{DataFile.objects.get(pk=source).file}> ", + f"header key <{values[1]}> dose not exist in <{DataFile.objects.get(pk=source).file}>.", data ] ) diff --git a/docs/curation/curation_files.png b/docs/curation/curation_files.png deleted file mode 100644 index 2e5d5af6ec0e248d4c45fcf0ead5844017085e1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45039 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�N(&iry*QD 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 z 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⪙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 z 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

)dUx&pEmcF$tS zE!W7SS7Vk;H|Dg8r?yrk@u#)4l2$59=_?`PhSPZZ|NRbu_kE;Z!+Q3{_0mQoL>c8f z=~Gqg-*-5zI0Kc(?YR6pmKXi&bq}MGPK4)4fwieT+M{h#1_tU7So37%iwseId|WST zP43kOzi;#3SX5t%4}^)0{ete80_M)2b zBO?o$fA#*OKiJvTW;m@SV@??JYEBF1xy;E#lCI~DoGXPPEF{2Ctu#cpaH&2(J4OTivS43dl6W zl8qpY6ed+#*!ZuU64s0+l(8U)xc+edBHYarkk{#+z8;c$T1hhYFfN?};gB1tGU@jt z@fX%Z-DC$_@0*=99!{nDZ|kft%^pFPrq|Y|6C^kzzgZ|%y1i3>Zji5AIKpUBN))-k zEJ@75^4KZOZL#3wyj3do`w*P9>}Q07CX1}w?j;TRrI#F89G&O?;IvrL^d1-Z$-nD& zOacN+OIvzH3ju_<#zlvm?}-~0f}9WG3rF5>8@xO^8nUN7&NR!PgG|?y{|Dtfp2(7ACn6`3o+R?N+sHkoe;44k#+!{yCBG2MI zzcRS}xq5)cdHKTaNv#XM5KgRw}m{|7|4vHGcu^b`}LkeJ{EACkUFF z@J1v13kGscbZh?|IK+J~-ZlGkTL3Nlr1tPG*C}0NGm(ni&U&^F8*hUtMYLLZ z6Wdc(T6n5BdvcV6oOU$Vt*6E`ft3)ardGYRq_LgkuCuration of pharmacokinetics data for PK-DB

From 406bea62bbf21e4c104878ef534a124711d3393a Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Fri, 18 Oct 2019 14:52:05 +0200 Subject: [PATCH 04/19] working on pkdb analysis binding --- backend/pkdb_app/behaviours.py | 4 +- backend/pkdb_app/documents.py | 1 + backend/pkdb_app/interventions/documents.py | 16 +- backend/pkdb_app/interventions/models.py | 11 + backend/pkdb_app/interventions/serializers.py | 6 +- backend/pkdb_app/interventions/views.py | 27 ++- backend/pkdb_app/outputs/documents.py | 3 +- backend/pkdb_app/outputs/models.py | 221 +++++++++++++++++- backend/pkdb_app/outputs/serializers.py | 76 +++++- backend/pkdb_app/outputs/views.py | 85 ++++++- backend/pkdb_app/subjects/documents.py | 126 +++++++++- backend/pkdb_app/subjects/managers.py | 10 + backend/pkdb_app/subjects/models.py | 197 ++++++++++++++-- backend/pkdb_app/subjects/serializers.py | 19 +- backend/pkdb_app/subjects/views.py | 80 ++++++- backend/pkdb_app/urls.py | 18 +- 16 files changed, 841 insertions(+), 59 deletions(-) diff --git a/backend/pkdb_app/behaviours.py b/backend/pkdb_app/behaviours.py index 886b2d7f..a43a61cc 100644 --- a/backend/pkdb_app/behaviours.py +++ b/backend/pkdb_app/behaviours.py @@ -46,7 +46,7 @@ def study_name(self): return self.study.name @property - def study_pk(self): - return self.study.pk + def study_sid(self): + return self.study.sid diff --git a/backend/pkdb_app/documents.py b/backend/pkdb_app/documents.py index 56fb296f..022e6c5c 100644 --- a/backend/pkdb_app/documents.py +++ b/backend/pkdb_app/documents.py @@ -8,6 +8,7 @@ elastic_settings = { 'number_of_shards': 1, 'number_of_replicas': 1, + } edge_ngram_filter = token_filter( diff --git a/backend/pkdb_app/interventions/documents.py b/backend/pkdb_app/interventions/documents.py index 6b8fbb0e..c81942f7 100644 --- a/backend/pkdb_app/interventions/documents.py +++ b/backend/pkdb_app/interventions/documents.py @@ -35,18 +35,15 @@ class InterventionDocument(Document): } ) choice = string_field('choice') - #application = string_field('application') time_unit = string_field('time_unit') time = fields.FloatField() substance = string_field('substance_name') - study = string_field('study_name') - #route = string_field('route') - #form = string_field('form') + study_name = string_field('study_name') + study_sid = string_field('study_sid') + name = string_field('name') normed = fields.BooleanField() - raw = ObjectField(properties={ - 'pk': fields.IntegerField() - }) + raw_pk = string_field('raw_pk') value = fields.FloatField() mean = fields.FloatField() median = fields.FloatField() @@ -75,3 +72,8 @@ class Django: class Index: name = 'interventions' settings = elastic_settings + + def get_queryset(self): + """Not mandatory but to improve performance we can select related in one sql request""" + return super(InterventionDocument, self).get_queryset().select_related( + 'ex__interventionset__study') diff --git a/backend/pkdb_app/interventions/models.py b/backend/pkdb_app/interventions/models.py index 671ade9e..01c7cfcb 100644 --- a/backend/pkdb_app/interventions/models.py +++ b/backend/pkdb_app/interventions/models.py @@ -119,6 +119,13 @@ class Intervention(Accessible, Normalizable, AbstractIntervention): application = models.ForeignKey(Application, on_delete=models.CASCADE, null=True) form = models.ForeignKey(Form, on_delete=models.CASCADE, null=True) + @property + def raw_pk(self): + if self.raw: + return self.raw.pk + else: + return None + @property def route_name(self): if self.route: @@ -144,6 +151,10 @@ def form_name(self): def study_name(self): return self.study.name + @property + def study_sid(self): + return self.study.sid + @property def study(self): return self.ex.interventionset.study diff --git a/backend/pkdb_app/interventions/serializers.py b/backend/pkdb_app/interventions/serializers.py index 3ce1aac6..bdc3f065 100644 --- a/backend/pkdb_app/interventions/serializers.py +++ b/backend/pkdb_app/interventions/serializers.py @@ -246,13 +246,11 @@ class Meta: class InterventionElasticSerializer(serializers.ModelSerializer): - allowed_users = UserElasticSerializer(many=True, read_only=True) substance = serializers.CharField(allow_null=True) measurement_type = serializers.CharField() route = serializers.CharField() application = serializers.CharField() form = serializers.CharField() - value = serializers.FloatField(allow_null=True) mean = serializers.FloatField(allow_null=True) median = serializers.FloatField(allow_null=True) @@ -261,10 +259,10 @@ class InterventionElasticSerializer(serializers.ModelSerializer): sd = serializers.FloatField(allow_null=True) se = serializers.FloatField(allow_null=True) cv = serializers.FloatField(allow_null=True) - raw = PkSerializer() + class Meta: model = Intervention - fields = ["pk","study", "access","allowed_users", "normed", "raw"] + VALUE_FIELDS + INTERVENTION_FIELDS + MEASUREMENTTYPE_FIELDS + fields = ["study_sid","study_name", "pk","raw_pk", "normed"] + INTERVENTION_FIELDS + MEASUREMENTTYPE_FIELDS def to_representation(self, instance): diff --git a/backend/pkdb_app/interventions/views.py b/backend/pkdb_app/interventions/views.py index 8597f248..68e89db5 100644 --- a/backend/pkdb_app/interventions/views.py +++ b/backend/pkdb_app/interventions/views.py @@ -1,3 +1,4 @@ +import pandas as pd from django.urls import reverse from django_elasticsearch_dsl_drf.filter_backends import FilteringFilterBackend, \ OrderingFilterBackend, IdsFilterBackend, MultiMatchSearchFilterBackend @@ -52,7 +53,31 @@ class ElasticInterventionViewSet(AccessView): multi_match_options = { 'operator': 'and' } - filter_fields = {'name': 'name.raw','pk':'pk','normed':'normed',} + filter_fields = { + 'pk': 'pk', + 'study_sid': 'study_sid', + 'study_name': 'study_name.raw', + 'normed':'normed', + 'raw_pk': 'raw_pk', + 'name': 'name', + 'measurement_type': 'measurement_type', + 'choice': 'choice', + 'substance': 'substance', + 'route': 'route', + 'form': 'form', + 'application': 'application', + 'time_unit': 'time_unit', + 'unit': 'unit', + 'time': 'time', + 'value': 'value', + 'mean': 'mean', + 'median': 'median', + 'min': 'min', + 'max': 'max', + 'se': 'se', + 'sd': 'sd', + 'cv': 'cv', + } ordering_fields = {'name': 'name.raw', 'measurement_type':'measurement_type.raw', 'choice':'choice.raw', diff --git a/backend/pkdb_app/outputs/documents.py b/backend/pkdb_app/outputs/documents.py index b5cc773e..9e961c59 100644 --- a/backend/pkdb_app/outputs/documents.py +++ b/backend/pkdb_app/outputs/documents.py @@ -68,10 +68,11 @@ class Index: settings = { 'number_of_shards': 5, 'number_of_replicas': 1, - 'max_result_window': 40000 + 'max_result_window': 100000 } + # ------------------------------------ # Elastic Timecourse Document # ------------------------------------ diff --git a/backend/pkdb_app/outputs/models.py b/backend/pkdb_app/outputs/models.py index c459fa44..a272df93 100644 --- a/backend/pkdb_app/outputs/models.py +++ b/backend/pkdb_app/outputs/models.py @@ -123,7 +123,7 @@ class Output(AbstractOutput,Normalizable, Accessible): group = models.ForeignKey(Group, null=True, blank=True, on_delete=models.CASCADE) individual = models.ForeignKey(Individual, null=True, blank=True, on_delete=models.CASCADE) - _interventions = models.ManyToManyField(Intervention) + _interventions = models.ManyToManyField(Intervention, through="OutputIntervention") tissue = models.ForeignKey(Tissue,related_name="outputs", null=True, blank=True, on_delete=models.CASCADE) @@ -267,7 +267,7 @@ class Timecourse(AbstractOutput, Normalizable, Accessible): """ group = models.ForeignKey(Group, null=True, on_delete=models.CASCADE) individual = models.ForeignKey(Individual, null=True, on_delete=models.CASCADE) - _interventions = models.ManyToManyField(Intervention) + _interventions = models.ManyToManyField(Intervention, through="TimecourseIntervention") ex = models.ForeignKey( TimecourseEx, related_name="timecourses", on_delete=models.CASCADE ) @@ -512,3 +512,220 @@ def get_pharmacokinetic_variables(self): pk_dict["bodyweight_type"] = "median" return pk_dict + + +class OutputIntervention(Accessible, models.Model): + output = models.ForeignKey(Output, on_delete=models.CASCADE) + intervention = models.ForeignKey(Intervention, on_delete=models.CASCADE) + #intervention = models.ForeignKey(Intervention, on_delete=models.CASCADE) + #timecourse = models.ForeignKey(Timecourse, on_delete=models.CASCADE) + #timecourse_ex = models.ForeignKey(TimecourseEx, on_delete=models.CASCADE) + + class Meta: + unique_together = ("output", "intervention") + + @property + def study(self): + return self.intervention.study + + @property + def intervention_pk(self): + return self.intervention.pk + + @property + def intervention_name(self): + return self.intervention.name + + @property + def output_pk(self): + return self.output.pk + + @property + def group_name(self): + if self.output.group: + return self.output.group.name + + @property + def group_pk(self): + if self.output.group: + return self.output.group.pk + + @property + def individual_pk(self): + if self.output.individual: + return self.output.individual.pk + + @property + def individual_name(self): + if self.output.individual: + return self.output.individual.name + + @property + def value(self): + return self.output.value + + @property + def mean(self): + return self.output.mean + + @property + def median(self): + return self.output.median + + @property + def min(self): + return self.output.min + + @property + def max(self): + return self.output.max + + @property + def sd(self): + return self.output.sd + + @property + def se(self): + return self.output.se + + @property + def cv(self): + return self.output.cv + + @property + def unit(self): + return self.output.unit + + @property + def time(self): + return self.output.time + + @property + def time_unit(self): + return self.output.time_unit + + @property + def tissue(self): + if self.output.tissue: + return self.output.tissue.name + + @property + def measurement_type(self): + return self.output.measurement_type.name + + @property + def choice(self): + return self.output.choice + + @property + def substance(self): + if self.output.substance: + return self.output.substance.name + + +class TimecourseIntervention(Accessible,models.Model): + timecourse = models.ForeignKey(Timecourse, on_delete=models.CASCADE) + intervention = models.ForeignKey(Intervention, on_delete=models.CASCADE) + + class Meta: + unique_together = ("timecourse", "intervention") + + @property + def study(self): + return self.intervention.study + + + @property + def intervention_pk(self): + return self.intervention.pk + + @property + def intervention_name(self): + return self.intervention.name + + @property + def individual_pk(self): + if self.timecourse.individual: + return self.timecourse.individual.pk + + @property + def individual_name(self): + if self.timecourse.individual: + return self.timecourse.individual.name + + + @property + def group_name(self): + if self.timecourse.group: + return self.timecourse.group.name + + @property + def group_pk(self): + if self.timecourse.group: + return self.timecourse.group.pk + + @property + def timecourse_pk(self): + return self.timecourse.pk + + @property + def value(self): + return self.timecourse.value + + @property + def mean(self): + return self.timecourse.mean + + @property + def median(self): + return self.timecourse.median + + @property + def min(self): + return self.timecourse.min + + @property + def max(self): + return self.timecourse.max + + @property + def sd(self): + return self.timecourse.sd + + @property + def se(self): + return self.timecourse.se + + @property + def cv(self): + return self.timecourse.cv + + @property + def unit(self): + return self.timecourse.unit + + @property + def time(self): + return self.timecourse.time + + @property + def time_unit(self): + return self.timecourse.time_unit + + @property + def tissue(self): + if self.timecourse.tissue: + return self.timecourse.tissue.name + + @property + def measurement_type(self): + return self.timecourse.measurement_type.name + + @property + def choice(self): + return self.timecourse.choice + + @property + def substance(self): + if self.timecourse.substance: + return self.timecourse.substance.name diff --git a/backend/pkdb_app/outputs/serializers.py b/backend/pkdb_app/outputs/serializers.py index 521565a9..7f1dade6 100644 --- a/backend/pkdb_app/outputs/serializers.py +++ b/backend/pkdb_app/outputs/serializers.py @@ -26,7 +26,7 @@ OutputSet, Timecourse, OutputEx, - TimecourseEx) + TimecourseEx, OutputIntervention, TimecourseIntervention) from ..serializers import ( ExSerializer, PkSerializer) @@ -415,6 +415,42 @@ def get_outputs(self,obj): def get_timecourses(self,obj): return list_of_pk("timecourses",obj) +class OutputInterventionSerializer(serializers.ModelSerializer): + class Meta: + model = OutputIntervention + fields = ["study_sid","study_name","output_pk","intervention_pk","group_pk","individual_pk"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS + + + def to_representation(self, instance): + rep = super().to_representation(instance) + for field in VALUE_FIELDS_NO_UNIT: + try: + rep[field] = '{:.2e}'.format(rep[field]) + except (ValueError, TypeError): + pass + return rep + +class TimecourseInterventionSerializer(serializers.ModelSerializer): + class Meta: + model = TimecourseIntervention + fields = ["study_sid","study_name","timecourse_pk","intervention_pk","group_pk","individual_pk"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS + + def to_representation(self, instance): + rep = super().to_representation(instance) + for field in VALUE_FIELDS_NO_UNIT + ['time']: + try: + result = [] + for x in rep[field]: + try: + result.append('{:.2e}'.format(x)) + except (ValueError, TypeError): + result.append(x) + rep[field] = result + except TypeError: + pass + return rep + + class OutputElasticSerializer(serializers.HyperlinkedModelSerializer): group = GroupSmallElasticSerializer() @@ -460,6 +496,43 @@ def to_representation(self, instance): return rep +class OutputAnalysisSerializer(serializers.Serializer): + pk = serializers.IntegerField(allow_null=True) + intervention_pk = serializers.IntegerField(allow_null=True) + individual_pk = serializers.IntegerField(allow_null=True) + group_pk = serializers.IntegerField(allow_null=True) + timecourse_pk = serializers.IntegerField(allow_null=True) + + study = serializers.CharField(allow_null=True) + tissue = serializers.CharField() + substance = serializers.CharField(allow_null=True) + measurement_type = serializers.CharField() + unit = serializers.CharField(allow_null=True) + time_unit = serializers.CharField(allow_null=True) + choice = serializers.CharField(allow_null=True) + + time = serializers.FloatField(allow_null=True) + value = serializers.FloatField(allow_null=True) + mean = serializers.FloatField(allow_null=True) + median = serializers.FloatField(allow_null=True) + min = serializers.FloatField(allow_null=True) + max = serializers.FloatField(allow_null=True) + sd = serializers.FloatField(allow_null=True) + se = serializers.FloatField(allow_null=True) + cv = serializers.FloatField(allow_null=True) + + + class Meta: + fields = ( + ["pk", "study"] + + OUTPUT_FIELDS + + VALUE_FIELDS + + MEASUREMENTTYPE_FIELDS + + ["group_pk", "individual_pk", "normed", "calculated", "timecourse_pk", "intervention_pk"]) + + + + class TimecourseElasticSerializer(serializers.HyperlinkedModelSerializer): group = GroupSmallElasticSerializer() individual = IndividualSmallElasticSerializer() @@ -467,6 +540,7 @@ class TimecourseElasticSerializer(serializers.HyperlinkedModelSerializer): measurement_type = serializers.CharField() tissue = serializers.CharField() + raw = PkSerializer() pharmacokinetics = PkSerializer(many=True) substance = serializers.CharField() diff --git a/backend/pkdb_app/outputs/views.py b/backend/pkdb_app/outputs/views.py index ff306068..a0fd2bc5 100644 --- a/backend/pkdb_app/outputs/views.py +++ b/backend/pkdb_app/outputs/views.py @@ -7,10 +7,14 @@ from rest_framework.response import Response from pkdb_app.documents import AccessView +from pkdb_app.outputs.models import Output, OutputIntervention, TimecourseIntervention from .documents import OutputDocument, TimecourseDocument -from .serializers import (OutputElasticSerializer, TimecourseElasticSerializer) +from .serializers import (OutputElasticSerializer, TimecourseElasticSerializer, OutputAnalysisSerializer, + OutputSerializer, OutputInterventionSerializer, TimecourseInterventionSerializer) from ..pagination import CustomPagination - +import pandas as pd +import numpy as np +import math ############################################################################################### # Option Views ############################################################################################### @@ -62,9 +66,13 @@ class ElasticOutputViewSet(AccessView): } filter_fields = {'pk':'pk', 'study':'study.raw', + 'tissue':"tissue.raw", + 'time':'time.raw', + 'choice': 'choice.raw', 'normed':'normed', 'calculated':'calculated', 'unit':'unit', + 'access':'access', 'substance':'substance', 'measurement_type':'measurement_type.raw', 'group_pk': {'field': 'group.pk', @@ -72,11 +80,21 @@ class ElasticOutputViewSet(AccessView): LOOKUP_QUERY_IN, ], }, - 'individual_pk': {'field': 'individual.pk', + 'timecourse_pk': {'field': 'timecourse.pk', 'lookups': [ LOOKUP_QUERY_IN, ], + }, + 'individual_pk': {'field': 'individual.pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ]}, + 'interventions_pk': {'field': 'interventions.pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], }} + ordering_fields = {'measurement_type':'measurement_type.raw', 'tissue':'tissue.raw', 'substance':'substance', @@ -85,6 +103,66 @@ class ElasticOutputViewSet(AccessView): 'value':'value', } +class OutputInterventionViewSet(viewsets.ModelViewSet): + queryset = OutputIntervention.objects.all().select_related('intervention', 'output','intervention__ex__interventionset__study',) + serializer_class = OutputInterventionSerializer + model = OutputIntervention + +class TimecourseInterventionViewSet(viewsets.ModelViewSet): + queryset = TimecourseIntervention.objects.all().select_related('intervention', 'timecourse','intervention__ex__interventionset__study',) + serializer_class = TimecourseInterventionSerializer + model = TimecourseIntervention + +class OutputAnalysisViewSet(ElasticOutputViewSet): + #pagination_class = None + #paginator = None + #PAGE_SIZE = 10000 + + #def paginate_queryset(self, queryset): + # return None + + def list(self, request, *args, **kwargs): + results = super().list(request, *args, **kwargs) + + df = pd.DataFrame(results.data["data"]["data"]) + #df = pd.DataFrame(results.data) + #print(len(df)) + + lst_col = "interventions" + df = pd.DataFrame({col: np.repeat(df[col].values, df[lst_col].str.len()) + for col in df.columns.difference([lst_col])}).assign( + **{lst_col: np.concatenate(df[lst_col].values)})[df.columns.tolist()] + + df["intervention_pk"] = df["interventions"].apply(lambda intervention: intervention.get("pk",None)) + + def get_pk(data): + if isinstance(data,dict): + return data.get("pk",None) + + + df["group_pk"] = df["group"].apply(get_pk) + df["individual_pk"] = df["individual"].apply(get_pk) + df["timecourse_pk"] = df["timecourse"].apply(get_pk) + df["individual_pk"] = df["individual"].apply(get_pk) + + df = df.where(df.notnull(), None) + + del df["raw"] + del df["timecourse"] + del df["interventions"] + del df["individual"] + del df["group"] + del df["allowed_users"] + + + results.data["data"]["data"] = df.to_dict('records') + del results.data["data"]["count"] + #results.data = df.to_dict('records') + return results + + + + class ElasticTimecourseViewSet(AccessView): document = TimecourseDocument serializer_class = TimecourseElasticSerializer @@ -116,5 +194,4 @@ class ElasticTimecourseViewSet(AccessView): 'group':'group.name', 'individual': 'individual.name', 'substance':'substance', - } diff --git a/backend/pkdb_app/subjects/documents.py b/backend/pkdb_app/subjects/documents.py index 7dae5d62..d28ad658 100644 --- a/backend/pkdb_app/subjects/documents.py +++ b/backend/pkdb_app/subjects/documents.py @@ -1,7 +1,7 @@ from elasticsearch_dsl import analyzer from django_elasticsearch_dsl import Document, fields from django_elasticsearch_dsl.registries import registry -from pkdb_app.subjects.models import Individual, Characteristica, Group +from pkdb_app.subjects.models import Individual, Characteristica, Group, GroupCharacteristica from pkdb_app.interventions.documents import string_field, ObjectField from ..documents import elastic_settings @@ -117,6 +117,11 @@ class Index: name = 'groups' settings = elastic_settings + def get_queryset(self): + """Not mandatory but to improve performance we can select related in one sql request""" + return super(GroupDocument, self).get_queryset().select_related( + 'ex__groupset__study','parent').prefetch_related("characteristica") + # ------------------------------------ # Elastic Characteristica Document @@ -125,20 +130,35 @@ class Index: class CharacteristicaDocument(Document): """ Characteristica elastic search document. """ id = fields.IntegerField(attr='id') + raw_pk = string_field('raw_pk') + + study_name = string_field('study_name') + study_sid = string_field('study_sid') + subject_type = string_field('subject_type') + + # group related + group_pk = fields.IntegerField(attr='group_pk') group_name = fields.StringField( attr='group_name', fields={ 'raw': fields.StringField(analyzer='keyword'), } ) - group_pk = fields.IntegerField(attr='group_id') + group_count = fields.IntegerField(attr='group_count') + group_parent_pk = fields.IntegerField( + attr='group_parent_pk', + ) + #individual_related individual_name = fields.StringField( attr='individual_name', fields={ 'raw': fields.StringField(analyzer='keyword'), } ) - individual_pk = fields.IntegerField(attr='individual_id') + individual_pk = fields.IntegerField(attr='individual_pk') + individual_group_pk = fields.IntegerField(attr='individual_group_pk') + ### + measurement_type = fields.StringField( attr='measurement_type_name', fields={ @@ -172,9 +192,7 @@ class CharacteristicaDocument(Document): cv = fields.FloatField(attr='cv') normed = fields.BooleanField() - raw = ObjectField(properties={ - 'pk': fields.IntegerField()} - ) + access = string_field('access') allowed_users = fields.ObjectField( attr="allowed_users", @@ -193,4 +211,98 @@ class Django: class Index: name = "characteristica" - settings = elastic_settings + settings = {**elastic_settings, 'max_result_window': 50000} + + + def get_queryset(self): + """Not mandatory but to improve performance we can select related in one sql request""" + return super(CharacteristicaDocument, self).get_queryset().select_related( + 'group','individual') +# Elastic Characteristica Document +# ------------------------------------ + + + +@registry.register_document +class GroupCharacteristicaDocument(Document): + """ Characteristica elastic search document. """ + id = fields.IntegerField(attr='pk') + raw_pk = string_field('raw_pk') + study_name = string_field('study_name') + study_sid = string_field('study_sid') + + # group related + group_pk = fields.IntegerField(attr='group_pk') + group_name = fields.StringField( + attr='group_name', + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + group_count = fields.IntegerField(attr='group_count') + group_parent_pk = fields.IntegerField( + attr='group_parent_pk', + ) + characteristica_pk = fields.IntegerField( + attr='characteristica_pk', + ) + count = fields.IntegerField() + + measurement_type = fields.StringField( + attr='measurement_type_name', + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + choice = fields.StringField( + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + unit = fields.StringField( + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + substance = fields.StringField( + attr='substance_name', + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + value = fields.FloatField(attr='value') + mean = fields.FloatField(attr='mean') + median = fields.FloatField(attr='median') + min = fields.FloatField(attr='min') + max = fields.FloatField(attr='max') + se = fields.FloatField(attr='se') + sd = fields.FloatField(attr='sd') + cv = fields.FloatField(attr='cv') + + normed = fields.BooleanField() + + access = string_field('access') + allowed_users = fields.ObjectField( + attr="allowed_users", + properties={ + 'username': string_field("username") + }, + multi=True + ) + + class Django: + model = GroupCharacteristica + # Ignore auto updating of Elasticsearch when a model is saved/deleted: + ignore_signals = True + # Don't perform an index refresh after every update + auto_refresh = False + + class Index: + name = "group_characteristica" + settings = {**elastic_settings, 'max_result_window': 50000} + + + def get_queryset(self): + """Not mandatory but to improve performance we can select related in one sql request""" + return super(GroupCharacteristicaDocument, self).get_queryset().select_related( + 'group','characteristica') diff --git a/backend/pkdb_app/subjects/managers.py b/backend/pkdb_app/subjects/managers.py index 277f65fc..b28e4500 100644 --- a/backend/pkdb_app/subjects/managers.py +++ b/backend/pkdb_app/subjects/managers.py @@ -35,6 +35,12 @@ def create(self, *args, **kwargs): study_group_exs.append(study_group_ex) groupset.save() + + # add characteristica from parents to the all_characteristica_normed if each group + for group in groupset.groups: + group.characteristica_all_normed.add(*group._characteristica_all_normed) + + return groupset @@ -124,6 +130,10 @@ def create(self, *args, **kwargs): create_multiple_bulk(individualset,"individualset", descriptions, Description) create_multiple_bulk(individualset,"individualset", comments, Comment) individualset.save() + + # add characteristica from parents to the all_characteristica_normed if each individual + for individual in individualset.individuals: + individual.characteristica_all_normed.add(*individual._characteristica_all_normed) return individualset diff --git a/backend/pkdb_app/subjects/models.py b/backend/pkdb_app/subjects/models.py index d4cab0ec..3a68d1a1 100644 --- a/backend/pkdb_app/subjects/models.py +++ b/backend/pkdb_app/subjects/models.py @@ -26,6 +26,9 @@ from django.apps import apps +SUBJECT_TYPE_GROUP = "group" +SUBJECT_TYPE_INDIVIDUAL = "individual" + # ---------------------------------- # DataFile # ---------------------------------- @@ -135,6 +138,7 @@ class Group(Accessible): name = models.CharField(max_length=CHAR_MAX_LENGTH) count = models.IntegerField() parent = models.ForeignKey("Group", null=True, on_delete=models.CASCADE) + characteristica_all_normed = models.ManyToManyField("Characteristica",related_name="groups", through="GroupCharacteristica") objects = GroupManager() # class Meta: @@ -161,17 +165,17 @@ def parents(self): return parents @property - def characteristica_all(self): + def _characteristica_all(self): characteristica_all = self.characteristica.all() additive_characteristica = ["disease","abstinence"] this_measurements = characteristica_all.exclude(measurement_type__name__in=additive_characteristica).values_list("measurement_type", flat=True) if self.parent: - characteristica_all = characteristica_all | self.parent.characteristica_all.exclude(measurement_type__in=this_measurements) + characteristica_all = characteristica_all | self.parent._characteristica_all.exclude(measurement_type__in=this_measurements) return characteristica_all @property - def characteristica_all_normed(self): - return self.characteristica_all.filter(normed=True) + def _characteristica_all_normed(self): + return self._characteristica_all.filter(normed=True) @@ -217,6 +221,7 @@ class IndividualEx(Externable, AbstractIndividual): name = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) name_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) + objects = IndividualExManager() class Meta: @@ -247,6 +252,7 @@ class Individual(AbstractIndividual, Accessible): Group, on_delete=models.CASCADE, related_name="individuals" ) name = models.CharField(max_length=CHAR_MAX_LENGTH) + characteristica_all_normed = models.ManyToManyField("Characteristica",related_name="individuals", through="IndividualCharacteristica") objects = IndividualManager() @property @@ -258,19 +264,17 @@ def figure(self): return self.ex.figure @property - def characteristica_normed(self): + def _characteristica_normed(self): return self.characteristica.filter(normed=True) - @property - def group_characteristica_normed(self): - return self.group.characteristica_all_normed @property - def characteristica_all_normed(self): - characteristica_normed = self.characteristica_normed - this_measurements = characteristica_normed.values_list("measurement_type", flat=True) + def _characteristica_all_normed(self): + characteristica_normed = self._characteristica_normed - return (characteristica_normed | self.group_characteristica_normed.exclude(measurement_type__in=this_measurements)) + # charcteristica from related groups with the same measurement type as these used in the individual are excluded. + this_measurements = characteristica_normed.values_list("measurement_type", flat=True) + return (characteristica_normed | self.group.characteristica_all_normed.exclude(measurement_type__in=this_measurements)) @property def study(self): @@ -293,7 +297,6 @@ def characteristica_choices(self): # Characteristica # ---------------------------------- - class AbstractCharacteristica(models.Model): count = models.IntegerField(null=True) @@ -335,7 +338,6 @@ class CharacteristicaEx( ) objects = CharacteristicaExManager() - class Characteristica(Accessible, Normalizable, AbstractCharacteristica): """ Characteristic. """ @@ -347,6 +349,13 @@ class Characteristica(Accessible, Normalizable, AbstractCharacteristica): ) count = models.IntegerField(default=1) + @property + def raw_pk(self): + if self.raw: + return self.raw.pk + else: + return None + @property def study(self): if self.group: @@ -354,6 +363,12 @@ def study(self): else: return self.individual.study + def study_name(self): + return self.study.name + + def study_sid(self): + return self.study.sid + @property def all_group_pks(self): parents = [] @@ -361,6 +376,13 @@ def all_group_pks(self): parents = [self.group.pk] + self.group.parents return parents + @property + def subject_type(self): + if self.group: + return SUBJECT_TYPE_GROUP + else: + return SUBJECT_TYPE_INDIVIDUAL + @property def group_name(self): if self.group: @@ -371,6 +393,17 @@ def group_pk(self): if self.group: return self.group.pk + @property + def group_count(self): + if self.group: + return self.group.count + + @property + def group_parent_pk(self): + if self.group: + if self.group.parent: + return self.group.parent.pk + @property def individual_name(self): if self.individual: @@ -380,3 +413,139 @@ def individual_name(self): def individual_pk(self): if self.individual: return self.individual.pk + + @property + def individual_group_pk(self): + if self.individual: + return self.individual.group.pk + + +class SubjectCharacteristica(Accessible,models.Model): + class Meta: + abstract = True + + @property + def characteristica_pk(self): + return self.characteristica.pk + + + @property + def raw_pk(self): + return self.characteristica.raw_pk + + @property + def normed(self): + return self.characteristica.normed + + @property + def count(self): + return self.characteristica.count + + @property + def measurement_type(self): + return self.characteristica.measurement_type.name + + + + @property + def choice(self): + return self.characteristica.choice + + @property + def substance(self): + return self.characteristica.substance.name + + @property + def unit(self): + return self.characteristica.unit + + @property + def value(self): + return self.characteristica.value + + @property + def mean(self): + return self.characteristica.mean + + @property + def median(self): + return self.characteristica.median + + @property + def min(self): + return self.characteristica.min + + @property + def max(self): + return self.characteristica.max + + @property + def sd(self): + return self.characteristica.sd + + @property + def se(self): + return self.characteristica.se + + @property + def cv(self): + return self.characteristica.cv + + + +class GroupCharacteristica(SubjectCharacteristica): + characteristica = models.ForeignKey(Characteristica, on_delete=models.CASCADE) + group = models.ForeignKey(Group, on_delete=models.CASCADE) + + + class Meta: + unique_together = ("characteristica", "group") + + @property + def study(self): + return self.group.study + + @property + def group_pk(self): + return self.group.pk + + @property + def group_parent_pk(self): + if self.group.parent: + return self.group.parent.pk + + @property + def group_name(self): + return self.group.name + + @property + def group_count(self): + return self.group.count + + + + +class IndividualCharacteristica(SubjectCharacteristica): + characteristica = models.ForeignKey(Characteristica, on_delete=models.CASCADE) + individual = models.ForeignKey(Individual, on_delete=models.CASCADE) + + class Meta: + unique_together = ("characteristica", "individual") + + @property + def study(self): + return self.individual.study + + @property + def individual_pk(self): + return self.individual.pk + + @property + def individual_name(self): + return self.individual.pk + + @property + def individual_group_pk(self): + return self.individual.group.pk + + diff --git a/backend/pkdb_app/subjects/serializers.py b/backend/pkdb_app/subjects/serializers.py index b64c2694..d9509f4a 100644 --- a/backend/pkdb_app/subjects/serializers.py +++ b/backend/pkdb_app/subjects/serializers.py @@ -22,7 +22,7 @@ Individual, CharacteristicaEx, GroupEx, -) + GroupCharacteristica, IndividualCharacteristica) from ..serializers import WrongKeyValidationSerializer, ExSerializer, ReadSerializer, validate_dict CHARACTERISTISTA_FIELDS = ["count"] @@ -410,11 +410,11 @@ def to_internal_value(self, data): class CharacteristicaElasticBigSerializer(ReadSerializer): measurement_type = serializers.CharField() substance = serializers.CharField(allow_null=True) + pk = serializers.IntegerField(source="id") class Meta: model = Characteristica - fields = ["pk"] + CHARACTERISTISTA_FIELDS + ["normed"] + MEASUREMENTTYPE_FIELDS + ["group_pk","group_name"] +["individual_pk","individual_name", "all_group_pks"] - + fields = ["pk","raw_pk","normed","study_sid","study_name","subject_type"] + CHARACTERISTISTA_FIELDS + MEASUREMENTTYPE_FIELDS + ["group_pk","group_name","group_count","group_parent_pk"] +["individual_pk","individual_name","individual_group_pk"] ############################################################################################### # Elastic Search Serializer @@ -442,12 +442,11 @@ class CharacteristicaElasticSerializer(serializers.ModelSerializer): cv = serializers.FloatField(allow_null=True) measurement_type = serializers.CharField() substance = serializers.CharField(allow_null=True) - allowed_users = UserElasticSerializer(many=True, read_only=True) class Meta: model = Characteristica - fields = ["pk"] + CHARACTERISTISTA_FIELDS + MEASUREMENTTYPE_FIELDS + ["normed"] + ["access","allowed_users"] + fields = ["pk"] + CHARACTERISTISTA_FIELDS + MEASUREMENTTYPE_FIELDS + ["normed"]# + ["access","allowed_users"] def to_representation(self, instance): rep = super().to_representation(instance) @@ -554,3 +553,13 @@ def get_characteristica_all_normed(self, instance): characteristica = sorted(instance.characteristica_all_normed, key=itemgetter('count')) return CharacteristicaElasticSerializer(characteristica,many=True, read_only=True).data + +class GroupCharacteristicaSerializer(serializers.ModelSerializer): + class Meta: + model = GroupCharacteristica + fields = ["study_sid","study_name","group_pk","group_name","group_count","group_parent_pk","characteristica_pk", "count"] + MEASUREMENTTYPE_FIELDS + +class IndividualCharacteristicaSerializer(serializers.ModelSerializer): + class Meta: + model = IndividualCharacteristica + fields = ["study_sid" ,"study_name", "individual_pk","individual_name", "individual_group_pk","characteristica_pk","count"] + MEASUREMENTTYPE_FIELDS \ No newline at end of file diff --git a/backend/pkdb_app/subjects/views.py b/backend/pkdb_app/subjects/views.py index ff3de395..16a78fbd 100644 --- a/backend/pkdb_app/subjects/views.py +++ b/backend/pkdb_app/subjects/views.py @@ -1,3 +1,4 @@ +from elasticsearch_dsl import Q from pkdb_app.categorials.models import MeasurementType from pkdb_app.users.permissions import StudyPermission @@ -7,11 +8,11 @@ from pkdb_app.pagination import CustomPagination from pkdb_app.subjects.models import ( DataFile, -) + SUBJECT_TYPE_GROUP, SUBJECT_TYPE_INDIVIDUAL, GroupCharacteristica, IndividualCharacteristica) from pkdb_app.subjects.serializers import ( DataFileSerializer, IndividualElasticSerializer, GroupElasticSerializer, CharacteristicaElasticBigSerializer, - CharacteristicaElasticSerializer) + CharacteristicaElasticSerializer, GroupCharacteristicaSerializer, IndividualCharacteristicaSerializer) from pkdb_app.subjects.documents import IndividualDocument, CharacteristicaDocument, GroupDocument ############################################################ @@ -122,7 +123,6 @@ class CharacteristicaElasticViewSet(AccessView): search_fields = ( 'choice', - 'group_name', ) multi_match_search_fields = {field: {"boost": 1} for field in search_fields} multi_match_options = { @@ -134,10 +134,7 @@ class CharacteristicaElasticViewSet(AccessView): } filter_fields = { - 'all_group_pks': { - 'field': 'all_group_pks', - }, - 'id': 'id', + 'pk': 'pk', 'value': 'value', 'mean': 'mean', 'median': 'median', @@ -149,9 +146,78 @@ class CharacteristicaElasticViewSet(AccessView): 'normed':'normed', 'group_name': 'group_name.raw', 'group_pk': 'group_pk', + 'individual_name': 'individual_name.raw', 'individual_pk': 'individual_pk', + 'study_sid': 'study_sid', + + } +class GroupCharacteristicaViewSet(viewsets.ModelViewSet): + queryset = GroupCharacteristica.objects.all().select_related('group', 'characteristica','group__ex__groupset__study',) + serializer_class = GroupCharacteristicaSerializer + model = GroupCharacteristica + + # filter_fields = { + # 'characteristica_pk': 'characteristica_pk', + # 'group_pk': 'group_pk', + # } + + ''' 'raw_pk':'raw_pk', + 'normed': 'normed', + 'study_sid': 'study_sid', + 'study_name': 'study_name', + 'name': 'name', + 'count':'count', + 'measurement_type':'measurement_type', + 'choice': 'choice', + 'substance': 'substance', + 'value': 'value', + 'mean': 'mean', + 'median': 'median', + 'min': 'min', + 'max': 'max', + 'se': 'se', + 'sd': 'sd', + 'cv': 'cv', + 'group_pk': 'group_pk', + 'group_name': 'group_name', + 'group_count': 'group_count', + 'group_parent_pk': 'group_parent_pk', + } + + ''' + +class IndividualCharacteristicaViewSet(viewsets.ModelViewSet): + queryset = IndividualCharacteristica.objects.all().select_related('individual', 'characteristica','individual__ex__individualset__study',) + serializer_class = IndividualCharacteristicaSerializer + model = IndividualCharacteristica +# +# filter_fields = { +# 'characteristica_pk': 'characteristica_pk', +# 'individual_pk': 'individual_pk', +# } + """" + 'raw_pk':'raw_pk', + 'normed': 'normed', + 'study_sid': 'study_sid', + 'study_name': 'study_name', + 'name': 'name', + 'count':'count', + 'measurement_type':'measurement_type', + 'choice': 'choice', + 'substance': 'substance', + 'value': 'value', + 'mean': 'mean', + 'median': 'median', + 'min': 'min', + 'max': 'max', + 'se': 'se', + 'sd': 'sd', + 'cv': 'cv', + 'individual_name': 'individual_name', + 'individual_group_pk': 'individual_group_pk', } + """ ############################################################ #Views queried not from elastic search diff --git a/backend/pkdb_app/urls.py b/backend/pkdb_app/urls.py index 96db21a1..5fb03f1e 100755 --- a/backend/pkdb_app/urls.py +++ b/backend/pkdb_app/urls.py @@ -7,13 +7,13 @@ from pkdb_app.categorials.views import MeasurementTypeViewSet, MeasurementTypeElasticViewSet, TissueViewSet, \ ApplicationViewSet, FormViewSet, RouteViewSet from pkdb_app.outputs.views import ElasticTimecourseViewSet, ElasticOutputViewSet, OutputOptionViewSet, \ - TimecourseOptionViewSet + TimecourseOptionViewSet, OutputAnalysisViewSet, OutputInterventionViewSet, \ + TimecourseInterventionViewSet from pkdb_app.substances.views import SubstanceViewSet, ElasticSubstanceViewSet, SubstanceStatisticsViewSet from rest_framework.authtoken.views import obtain_auth_token from rest_framework.routers import DefaultRouter from rest_framework_swagger.views import get_swagger_view -from rest_framework.schemas import get_schema_view from .comments.views import ElasticCommentViewSet, ElasticDescriptionViewSet @@ -22,7 +22,8 @@ from .subjects.views import ( DataFileViewSet, IndividualViewSet, - CharacteristicaElasticViewSet, CharacteristicaOptionViewSet, GroupViewSet) + CharacteristicaElasticViewSet, CharacteristicaOptionViewSet, GroupViewSet, GroupCharacteristicaViewSet, + IndividualCharacteristicaViewSet) from .interventions.views import InterventionOptionViewSet, ElasticInterventionViewSet from .users.views import UserViewSet, UserCreateViewSet, UserGroupViewSet, ObtainAuthTokenCustom from .studies.views import ( @@ -75,9 +76,19 @@ router.register("individuals_elastic", IndividualViewSet, base_name="individuals_elastic") router.register("groups_elastic", GroupViewSet, base_name="groups_elastic") router.register("characteristica_elastic", CharacteristicaElasticViewSet, base_name="characteristica_elastic") + +router.register("characteristica_groups", GroupCharacteristicaViewSet, base_name="characteristica_groups") +router.register("characteristica_individuals", IndividualCharacteristicaViewSet, base_name="characteristica_individuals") + + router.register("interventions_elastic", ElasticInterventionViewSet, base_name="interventions_elastic") router.register("timecourses_elastic", ElasticTimecourseViewSet, base_name="timecourses_elastic") router.register("outputs_elastic", ElasticOutputViewSet, base_name="outputs_elastic") +#router.register("outputs_analysis", OutputAnalysisViewSet, base_name="outputs_analysis") +router.register("output_intervention", OutputInterventionViewSet, base_name="output_intervention") +router.register("timecourse_intervention", TimecourseInterventionViewSet, base_name="timecourse_intervention") + + # Options router.register( @@ -94,7 +105,6 @@ ) schema_view = get_swagger_view(title="PKDB API") -#schema_view = get_schema_view(title="PKDB API") urlpatterns = [ From 5fedd19b04770e7cec584e063fcd94ad00c94d6a Mon Sep 17 00:00:00 2001 From: Matthias Koenig Date: Wed, 23 Oct 2019 16:52:08 +0200 Subject: [PATCH 05/19] yduport avatar added --- .../assets/images/avatars/yduport_128.png | Bin 0 -> 36927 bytes frontend/src/components/lib/UserAvatar.vue | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 frontend/public/assets/images/avatars/yduport_128.png diff --git a/frontend/public/assets/images/avatars/yduport_128.png b/frontend/public/assets/images/avatars/yduport_128.png new file mode 100644 index 0000000000000000000000000000000000000000..1a703309ccb1db32481e9c34887ec3083543ed82 GIT binary patch literal 36927 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 bHT?eogAJ9v6g0k^00000NkvXXu0mjfom8DZ literal 0 HcmV?d00001 diff --git a/frontend/src/components/lib/UserAvatar.vue b/frontend/src/components/lib/UserAvatar.vue index b3d7683c..45733b57 100644 --- a/frontend/src/components/lib/UserAvatar.vue +++ b/frontend/src/components/lib/UserAvatar.vue @@ -55,6 +55,8 @@ image = 'deepa_128.png'; } else if (this.initials === 'JB'){ image = 'jbrandhorst_128.png'; + } else if (this.initials === 'YD'){ + image = 'yduport_128.png'; } } else if (this.username) { image = 'user_128.png'; @@ -70,6 +72,8 @@ image = 'jbrandhorst_128.png'; } else if (this.username === 'deepa'){ image = 'deepa_128.png'; + } else if (this.username === 'yduport'){ + image = 'yduport_128.png'; } } return img_dir + image From 3e7b971d0c3d21e8db32d96189e8e567483daa55 Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Wed, 23 Oct 2019 16:59:37 +0200 Subject: [PATCH 06/19] added analysis rest api --- backend/pkdb_app/interventions/views.py | 18 +-- backend/pkdb_app/outputs/documents.py | 129 +++++++++++++++++- backend/pkdb_app/outputs/managers.py | 18 ++- backend/pkdb_app/outputs/models.py | 60 ++++---- backend/pkdb_app/outputs/serializers.py | 8 +- backend/pkdb_app/outputs/views.py | 174 +++++++++++++++++++----- backend/pkdb_app/studies/models.py | 27 +++- backend/pkdb_app/studies/views.py | 26 +++- backend/pkdb_app/subjects/documents.py | 94 +++++++++++-- backend/pkdb_app/subjects/managers.py | 1 + backend/pkdb_app/subjects/models.py | 16 ++- backend/pkdb_app/subjects/views.py | 138 +++++++++++-------- backend/pkdb_app/utils.py | 1 + 13 files changed, 549 insertions(+), 161 deletions(-) diff --git a/backend/pkdb_app/interventions/views.py b/backend/pkdb_app/interventions/views.py index 68e89db5..f6fbcc07 100644 --- a/backend/pkdb_app/interventions/views.py +++ b/backend/pkdb_app/interventions/views.py @@ -59,15 +59,15 @@ class ElasticInterventionViewSet(AccessView): 'study_name': 'study_name.raw', 'normed':'normed', 'raw_pk': 'raw_pk', - 'name': 'name', - 'measurement_type': 'measurement_type', - 'choice': 'choice', - 'substance': 'substance', - 'route': 'route', - 'form': 'form', - 'application': 'application', - 'time_unit': 'time_unit', - 'unit': 'unit', + 'name': 'name.raw', + 'measurement_type': 'measurement_type.raw', + 'choice': 'choice.raw', + 'substance': 'substance.raw', + 'route': 'route.raw', + 'form': 'form.raw', + 'application': 'application.raw', + 'time_unit': 'time_unit.raw', + 'unit': 'unit.raw', 'time': 'time', 'value': 'value', 'mean': 'mean', diff --git a/backend/pkdb_app/outputs/documents.py b/backend/pkdb_app/outputs/documents.py index 9e961c59..9eb0d251 100644 --- a/backend/pkdb_app/outputs/documents.py +++ b/backend/pkdb_app/outputs/documents.py @@ -1,7 +1,8 @@ from django_elasticsearch_dsl import Document, fields from django_elasticsearch_dsl.registries import registry from ..documents import string_field, elastic_settings, ObjectField -from .models import Output, Timecourse +from .models import Output, Timecourse, TimecourseIntervention, OutputIntervention + # ------------------------------------ # Elastic Output Document @@ -139,3 +140,129 @@ class Django: class Index: name = 'timecourses' settings = elastic_settings + + + +@registry.register_document +class TimecourseInterventionDocument(Document): + study_sid = string_field('study_sid') + study_name = string_field('study_name') + + timecourse_pk = fields.IntegerField('timecourse_pk') + intervention_pk = fields.IntegerField('intervention_pk') + group_pk = fields.IntegerField('group_pk') + individual_pk = fields.IntegerField('individual_pk') + + + tissue = string_field('tissue') + time = fields.FloatField('time', multi=True) + time_unit = string_field('time_unit') + unit = string_field('unit') + choice = string_field('choice') + + + # output fields + value = fields.FloatField('value', multi=True) + mean = fields.FloatField('mean', multi=True) + median = fields.FloatField('median', multi=True) + min = fields.FloatField('min', multi=True) + max = fields.FloatField('max', multi=True) + se = fields.FloatField('se', multi=True) + sd = fields.FloatField('sd', multi=True) + cv = fields.FloatField('cv', multi=True) + + measurement_type = string_field("measurement_type") + substance = string_field("substance") + normed = fields.BooleanField() + + # for permissions + access = string_field('access') + allowed_users = fields.ObjectField( + attr="allowed_users", + properties={ + 'username': string_field("username") + }, + multi=True + ) + + class Django: + model = TimecourseIntervention + # Ignore auto updating of Elasticsearch when a model is saved/deleted + ignore_signals = True + # Don't perform an index refresh after every update + auto_refresh = False + + class Index: + name = 'timecourses_interventions' + settings = { + 'number_of_shards': 1, + 'number_of_replicas': 1, + } + + def get_queryset(self): + """Not mandatory but to improve performance we can select related in one sql request""" + return super(TimecourseInterventionDocument, self).get_queryset().select_related( + 'intervention','timecourse') + + + +@registry.register_document +class OutputInterventionDocument(Document): + study_sid = string_field('study_sid') + study_name = string_field('study_name') + output_pk = fields.IntegerField('output_pk') + intervention_pk = fields.IntegerField('intervention_pk') + group_pk = fields.IntegerField('group_pk') + individual_pk = fields.IntegerField('individual_pk') + + measurement_type = string_field("measurement_type") + substance = string_field("substance") + normed = fields.BooleanField() + calculated = fields.BooleanField() + tissue = string_field('tissue') + time = fields.FloatField('time') + time_unit = string_field('time_unit') + unit = string_field('unit') + choice = string_field('choice') + + # output fields + value = fields.FloatField('value') + mean = fields.FloatField('mean') + median = fields.FloatField('median') + min = fields.FloatField('min') + max = fields.FloatField('max') + se = fields.FloatField('se') + sd = fields.FloatField('sd') + cv = fields.FloatField('cv') + + + # for permissions + access = string_field('access') + allowed_users = fields.ObjectField( + attr="allowed_users", + properties={ + 'username': string_field("username") + }, + multi=True + ) + + class Django: + model = OutputIntervention + # Ignore auto updating of Elasticsearch when a model is saved/deleted + ignore_signals = True + # Don't perform an index refresh after every update + auto_refresh = False + + class Index: + name = 'outputs_interventions' + settings = { + 'number_of_shards': 5, + 'number_of_replicas': 1, + 'max_result_window': 100000 + } + + def get_queryset(self): + """Not mandatory but to improve performance we can select related in one sql request""" + return super(OutputInterventionDocument, self).get_queryset().select_related( + 'intervention','output') + diff --git a/backend/pkdb_app/outputs/managers.py b/backend/pkdb_app/outputs/managers.py index f035e3b0..e85c885c 100644 --- a/backend/pkdb_app/outputs/managers.py +++ b/backend/pkdb_app/outputs/managers.py @@ -56,10 +56,10 @@ def create(self, *args, **kwargs): create_multiple(output_ex, comments, 'comments') outputs_dj = create_multiple(output_ex, outputs, 'outputs') - Output = apps.get_model('outputs', 'Output') - create_multiple_bulk_normalized(outputs_dj,Output) - output_ex.save() + outputs_normed = create_multiple_bulk_normalized(outputs_dj,Output) + for output in outputs_normed: + output._interventions.add(*output.interventions.all()) return output_ex @@ -88,10 +88,14 @@ def create(self, *args, **kwargs): Output = apps.get_model('outputs','Output') - timecourses = create_multiple_bulk_normalized(timecourses_dj, Timecourse) + timecourses_normed = create_multiple_bulk_normalized(timecourses_dj, Timecourse) + + for timecourse in timecourses_normed: + timecourse._interventions.add(*timecourse.interventions.all()) + # calculate pharmacokinetics data from normalized timecourses - for timecourse in timecourses: + for timecourse in timecourses_normed: if timecourse.measurement_type.name == "concentration" and timecourse.normed: variables = timecourse.get_pharmacokinetic_variables() c_type = variables.pop("c_type", None) @@ -128,7 +132,9 @@ def create(self, *args, **kwargs): outputs.append(output_dict) outputs_dj = create_multiple_bulk(timecourse, "timecourse", outputs, Output) - create_multiple_bulk_normalized(outputs_dj, Output) + outputs_normed = create_multiple_bulk_normalized(outputs_dj, Output) + for output in outputs_normed: + output._interventions.add(*output.interventions.all()) timecourse_ex.save() return timecourse_ex diff --git a/backend/pkdb_app/outputs/models.py b/backend/pkdb_app/outputs/models.py index a272df93..91f105b9 100644 --- a/backend/pkdb_app/outputs/models.py +++ b/backend/pkdb_app/outputs/models.py @@ -42,6 +42,8 @@ def outputs(self): outputs_timecourses = Output.objects.filter(timecourse__in=self.timecourses.all()) return outputs | outputs_timecourses + + @property def outputs_normed(self): outputs = self.outputs.filter(normed=True) @@ -268,11 +270,8 @@ class Timecourse(AbstractOutput, Normalizable, Accessible): group = models.ForeignKey(Group, null=True, on_delete=models.CASCADE) individual = models.ForeignKey(Individual, null=True, on_delete=models.CASCADE) _interventions = models.ManyToManyField(Intervention, through="TimecourseIntervention") - ex = models.ForeignKey( - TimecourseEx, related_name="timecourses", on_delete=models.CASCADE - ) - #tissue = models.CharField(max_length=CHAR_MAX_LENGTH, choices=OUTPUT_TISSUE_DATA_CHOICES) - tissue = models.ForeignKey(Tissue,related_name="timecourses", null=True, blank=True, on_delete=models.CASCADE) + ex = models.ForeignKey(TimecourseEx, related_name="timecourses", on_delete=models.CASCADE) + tissue = models.ForeignKey(Tissue, related_name="timecourses", null=True, blank=True, on_delete=models.CASCADE) value = ArrayField(models.FloatField(null=True), null=True) @@ -517,9 +516,6 @@ def get_pharmacokinetic_variables(self): class OutputIntervention(Accessible, models.Model): output = models.ForeignKey(Output, on_delete=models.CASCADE) intervention = models.ForeignKey(Intervention, on_delete=models.CASCADE) - #intervention = models.ForeignKey(Intervention, on_delete=models.CASCADE) - #timecourse = models.ForeignKey(Timecourse, on_delete=models.CASCADE) - #timecourse_ex = models.ForeignKey(TimecourseEx, on_delete=models.CASCADE) class Meta: unique_together = ("output", "intervention") @@ -562,35 +558,35 @@ def individual_name(self): @property def value(self): - return self.output.value + return self.output.null_value @property def mean(self): - return self.output.mean + return self.output.null_mean @property def median(self): - return self.output.median + return self.output.null_median @property def min(self): - return self.output.min + return self.output.null_min @property def max(self): - return self.output.max + return self.output.null_max @property def sd(self): - return self.output.sd + return self.output.null_sd @property def se(self): - return self.output.se + return self.output.null_se @property def cv(self): - return self.output.cv + return self.output.null_cv @property def unit(self): @@ -598,7 +594,7 @@ def unit(self): @property def time(self): - return self.output.time + return self.output.null_time @property def time_unit(self): @@ -622,6 +618,14 @@ def substance(self): if self.output.substance: return self.output.substance.name + @property + def normed(self): + return self.output.normed + + @property + def calculated(self): + return self.output.calculated + class TimecourseIntervention(Accessible,models.Model): timecourse = models.ForeignKey(Timecourse, on_delete=models.CASCADE) @@ -670,35 +674,35 @@ def timecourse_pk(self): @property def value(self): - return self.timecourse.value + return self.timecourse.null_value @property def mean(self): - return self.timecourse.mean + return self.timecourse.null_mean @property def median(self): - return self.timecourse.median + return self.timecourse.null_median @property def min(self): - return self.timecourse.min + return self.timecourse.null_min @property def max(self): - return self.timecourse.max + return self.timecourse.null_max @property def sd(self): - return self.timecourse.sd + return self.timecourse.null_sd @property def se(self): - return self.timecourse.se + return self.timecourse.null_se @property def cv(self): - return self.timecourse.cv + return self.timecourse.null_cv @property def unit(self): @@ -706,7 +710,7 @@ def unit(self): @property def time(self): - return self.timecourse.time + return self.timecourse.null_time @property def time_unit(self): @@ -729,3 +733,7 @@ def choice(self): def substance(self): if self.timecourse.substance: return self.timecourse.substance.name + + @property + def normed(self): + return self.timecourse.normed \ No newline at end of file diff --git a/backend/pkdb_app/outputs/serializers.py b/backend/pkdb_app/outputs/serializers.py index 7f1dade6..4cffc727 100644 --- a/backend/pkdb_app/outputs/serializers.py +++ b/backend/pkdb_app/outputs/serializers.py @@ -407,18 +407,18 @@ class OutputSetElasticSmallSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = OutputSet - fields = ["pk","descriptions", "outputs","timecourses","comments"] + fields = ["pk","descriptions", "outputs", "timecourses", "comments"] def get_outputs(self,obj): return list_of_pk("outputs",obj) def get_timecourses(self,obj): - return list_of_pk("timecourses",obj) + return list_of_pk("timecourses", obj) class OutputInterventionSerializer(serializers.ModelSerializer): class Meta: model = OutputIntervention - fields = ["study_sid","study_name","output_pk","intervention_pk","group_pk","individual_pk"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS + fields = ["study_sid", "study_name", "output_pk", "intervention_pk", "group_pk", "individual_pk", "normed", "calculated"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS def to_representation(self, instance): @@ -433,7 +433,7 @@ def to_representation(self, instance): class TimecourseInterventionSerializer(serializers.ModelSerializer): class Meta: model = TimecourseIntervention - fields = ["study_sid","study_name","timecourse_pk","intervention_pk","group_pk","individual_pk"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS + fields = ["study_sid", "study_name", "timecourse_pk", "intervention_pk", "group_pk", "individual_pk", "normed"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS def to_representation(self, instance): rep = super().to_representation(instance) diff --git a/backend/pkdb_app/outputs/views.py b/backend/pkdb_app/outputs/views.py index a0fd2bc5..79ec2e09 100644 --- a/backend/pkdb_app/outputs/views.py +++ b/backend/pkdb_app/outputs/views.py @@ -8,7 +8,7 @@ from pkdb_app.documents import AccessView from pkdb_app.outputs.models import Output, OutputIntervention, TimecourseIntervention -from .documents import OutputDocument, TimecourseDocument +from .documents import OutputDocument, TimecourseDocument, OutputInterventionDocument, TimecourseInterventionDocument from .serializers import (OutputElasticSerializer, TimecourseElasticSerializer, OutputAnalysisSerializer, OutputSerializer, OutputInterventionSerializer, TimecourseInterventionSerializer) from ..pagination import CustomPagination @@ -64,36 +64,39 @@ class ElasticOutputViewSet(AccessView): multi_match_options = { 'operator': 'and' } - filter_fields = {'pk':'pk', - 'study':'study.raw', - 'tissue':"tissue.raw", - 'time':'time.raw', - 'choice': 'choice.raw', - 'normed':'normed', - 'calculated':'calculated', - 'unit':'unit', - 'access':'access', - 'substance':'substance', - 'measurement_type':'measurement_type.raw', - 'group_pk': {'field': 'group.pk', - 'lookups': [ - LOOKUP_QUERY_IN, - ], - }, - 'timecourse_pk': {'field': 'timecourse.pk', - 'lookups': [ - LOOKUP_QUERY_IN, - ], - }, - 'individual_pk': {'field': 'individual.pk', - 'lookups': [ - LOOKUP_QUERY_IN, - ]}, - 'interventions_pk': {'field': 'interventions.pk', - 'lookups': [ - LOOKUP_QUERY_IN, - ], - }} + filter_fields = { + + 'study_name': 'study_name.raw', + 'study_sid': 'study_sid.raw', + + 'group_pk': {'field': 'group.pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], + }, + 'timecourse_pk': {'field': 'timecourse.pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], + }, + 'individual_pk': {'field': 'individual.pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ]}, + 'interventions_pk': {'field': 'interventions.pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], + }, + 'tissue':"tissue.raw", + 'time':'time.raw', + 'choice': 'choice.raw', + 'normed':'normed', + 'calculated':'calculated', + 'unit':'unit.raw', + 'substance':'substance.raw', + 'measurement_type':'measurement_type.raw', + } ordering_fields = {'measurement_type':'measurement_type.raw', 'tissue':'tissue.raw', @@ -103,15 +106,112 @@ class ElasticOutputViewSet(AccessView): 'value':'value', } -class OutputInterventionViewSet(viewsets.ModelViewSet): - queryset = OutputIntervention.objects.all().select_related('intervention', 'output','intervention__ex__interventionset__study',) +class OutputInterventionViewSet(AccessView): + document = OutputInterventionDocument serializer_class = OutputInterventionSerializer - model = OutputIntervention + pagination_class = CustomPagination + lookup_field = "id" + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] + search_fields = ('study', 'measurement_type', 'substance', 'group_name', 'individual_name', "tissue", 'time_unit', + 'intervention') + multi_match_search_fields = {field: {"boost": 1} for field in search_fields} + multi_match_options = { + 'operator': 'and' + } + filter_fields = { + 'study_name': 'study_name.raw', + 'study_sid': 'study_sid.raw', + 'output_pk': {'field': 'output_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], + }, + 'intervention_pk': {'field': 'intervention_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], + }, + 'group_pk': {'field': 'group_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], + }, + + 'individual_pk': {'field': 'individual_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ]}, + 'normed': 'normed', + 'calculated': 'calculated', + 'tissue': "tissue.raw", + 'time': 'time.raw', + 'time_unit': 'time_unit.raw', + 'measurement_type': 'measurement_type.raw', + 'substance': 'substance.raw', + + 'choice': 'choice.raw', + 'unit': 'unit.raw', + + + } + ordering_fields = {'measurement_type': 'measurement_type.raw', + 'tissue': 'tissue.raw', + 'substance': 'substance.raw', + 'group_name': 'group_name.raw', + 'individual_name': 'individual_name.raw', + 'value': 'value', + } + + +class TimecourseInterventionViewSet(AccessView): -class TimecourseInterventionViewSet(viewsets.ModelViewSet): - queryset = TimecourseIntervention.objects.all().select_related('intervention', 'timecourse','intervention__ex__interventionset__study',) + document = TimecourseInterventionDocument serializer_class = TimecourseInterventionSerializer - model = TimecourseIntervention + pagination_class = CustomPagination + lookup_field = "id" + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] + search_fields = ('study', 'measurement_type', 'substance', 'group_name', 'individual_name', "tissue", 'time_unit', + 'intervention') + multi_match_search_fields = {field: {"boost": 1} for field in search_fields} + multi_match_options = { + 'operator': 'and' + } + filter_fields = { + 'study_name': 'study_name.raw', + 'study_sid': 'study_sid.raw', + + 'tissue': "tissue.raw", + 'time': 'time.raw', + 'choice': 'choice.raw', + 'normed': 'normed', + 'unit': 'unit', + 'substance': 'substance', + 'measurement_type': 'measurement_type.raw', + 'group_pk': {'field': 'group_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], + }, + 'timecourse_pk': {'field': 'timecourse_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], + }, + 'individual_pk': {'field': 'individual_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ]}, + 'intervention_pk': {'field': 'intervention_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + ], + }} + ordering_fields = {'measurement_type': 'measurement_type.raw', + 'tissue': 'tissue.raw', + 'substance': 'substance.raw', + 'group_name': 'group_name.raw', + 'individual_name': 'individual_name.raw', + } class OutputAnalysisViewSet(ElasticOutputViewSet): #pagination_class = None diff --git a/backend/pkdb_app/studies/models.py b/backend/pkdb_app/studies/models.py index 3b5718dd..6e359e18 100644 --- a/backend/pkdb_app/studies/models.py +++ b/backend/pkdb_app/studies/models.py @@ -4,7 +4,7 @@ from django.db import models from pkdb_app.users.models import PUBLIC, PRIVATE -from ..outputs.models import OutputSet, Output, Timecourse +from ..outputs.models import OutputSet, Output, Timecourse, OutputIntervention, TimecourseIntervention from ..interventions.models import InterventionSet, DataFile, Intervention from ..substances.models import Substance @@ -176,6 +176,13 @@ def outputs(self): except AttributeError: return Output.objects.none() + @property + def outputs_interventions(self): + try: + return self.outputs.outputs_interventions.all() + except AttributeError: + return OutputIntervention.objects.none() + @property def timecourses(self): try: @@ -183,6 +190,13 @@ def timecourses(self): except AttributeError: return Timecourse.objects.none() + @property + def timecourses_interventions(self): + try: + return self.outputset.timecourses_interventions.all() + except AttributeError: + return TimecourseIntervention.objects.none() + @property def get_substances(self): """ Get all substances for given study. @@ -274,4 +288,15 @@ def output_calculated_count(self): return self.outputset.outputs.filter(normed=True, calculated=True).count() return 0 + def delete(self, *args, **kwargs): + if self.outputset: + self.outputset.delete() + if self.interventionset: + self.interventionset.delete() + if self.individualset: + self.individualset.delete() + if self.groupset: + self.groupset.delete() + super().delete(*args, **kwargs) + diff --git a/backend/pkdb_app/studies/views.py b/backend/pkdb_app/studies/views.py index d43839c9..d3f42ad6 100644 --- a/backend/pkdb_app/studies/views.py +++ b/backend/pkdb_app/studies/views.py @@ -4,7 +4,10 @@ from django_elasticsearch_dsl_drf.utils import DictionaryProxy from django_elasticsearch_dsl_drf.viewsets import DocumentViewSet -from pkdb_app.outputs.documents import OutputDocument, TimecourseDocument +from pkdb_app.outputs.documents import OutputDocument, TimecourseDocument, TimecourseInterventionDocument, \ + OutputInterventionDocument +from pkdb_app.outputs.models import TimecourseIntervention, OutputIntervention +from pkdb_app.subjects.models import GroupCharacteristica, IndividualCharacteristica from pkdb_app.users.models import PUBLIC from pkdb_app.users.permissions import IsAdminOrCreatorOrCurator, StudyPermission, user_group from rest_framework.exceptions import ValidationError @@ -14,7 +17,8 @@ from pkdb_app.interventions.documents import InterventionDocument from pkdb_app.pagination import CustomPagination from pkdb_app.studies.documents import ReferenceDocument, StudyDocument -from pkdb_app.subjects.documents import GroupDocument, IndividualDocument, CharacteristicaDocument +from pkdb_app.subjects.documents import GroupDocument, IndividualDocument, CharacteristicaDocument, \ + GroupCharacteristicaDocument, IndividualCharacteristicaDocument from .models import Reference, Study from .serializers import ( @@ -175,20 +179,30 @@ def delete_elastic_study(related_elastic): pass + def related_elastic_dict(study): """ Dictionary of elastic documents for given study. :param study: :return: """ + interventions = study.interventions.all() + groups = study.groups.all() + individuals = study.individuals.all() + docs_dict = { StudyDocument: study, - GroupDocument: study.groups, - IndividualDocument: study.individuals, + GroupDocument: groups, + IndividualDocument: individuals, CharacteristicaDocument: study.characteristica, - InterventionDocument: study.interventions, + GroupCharacteristicaDocument: GroupCharacteristica.objects.filter(group__in=groups), + IndividualCharacteristicaDocument: IndividualCharacteristica.objects.filter(individual__in=individuals), + InterventionDocument: interventions, OutputDocument: study.outputs, - TimecourseDocument: study.timecourses + TimecourseDocument: study.timecourses, + TimecourseInterventionDocument: TimecourseIntervention.objects.filter(intervention__in=interventions), + OutputInterventionDocument: OutputIntervention.objects.filter(intervention__in=interventions), + } if study.reference: docs_dict[ReferenceDocument] = study.reference diff --git a/backend/pkdb_app/subjects/documents.py b/backend/pkdb_app/subjects/documents.py index d28ad658..91169a69 100644 --- a/backend/pkdb_app/subjects/documents.py +++ b/backend/pkdb_app/subjects/documents.py @@ -1,7 +1,7 @@ from elasticsearch_dsl import analyzer from django_elasticsearch_dsl import Document, fields from django_elasticsearch_dsl.registries import registry -from pkdb_app.subjects.models import Individual, Characteristica, Group, GroupCharacteristica +from pkdb_app.subjects.models import Individual, Characteristica, Group, GroupCharacteristica, IndividualCharacteristica from pkdb_app.interventions.documents import string_field, ObjectField from ..documents import elastic_settings @@ -222,14 +222,12 @@ def get_queryset(self): # ------------------------------------ - @registry.register_document class GroupCharacteristicaDocument(Document): """ Characteristica elastic search document. """ - id = fields.IntegerField(attr='pk') - raw_pk = string_field('raw_pk') - study_name = string_field('study_name') study_sid = string_field('study_sid') + study_name = string_field('study_name') + # group related group_pk = fields.IntegerField(attr='group_pk') @@ -249,7 +247,7 @@ class GroupCharacteristicaDocument(Document): count = fields.IntegerField() measurement_type = fields.StringField( - attr='measurement_type_name', + attr='measurement_type', fields={ 'raw': fields.StringField(analyzer='keyword'), } @@ -265,7 +263,7 @@ class GroupCharacteristicaDocument(Document): } ) substance = fields.StringField( - attr='substance_name', + attr='substance', fields={ 'raw': fields.StringField(analyzer='keyword'), } @@ -279,8 +277,6 @@ class GroupCharacteristicaDocument(Document): sd = fields.FloatField(attr='sd') cv = fields.FloatField(attr='cv') - normed = fields.BooleanField() - access = string_field('access') allowed_users = fields.ObjectField( attr="allowed_users", @@ -306,3 +302,83 @@ def get_queryset(self): """Not mandatory but to improve performance we can select related in one sql request""" return super(GroupCharacteristicaDocument, self).get_queryset().select_related( 'group','characteristica') + +@registry.register_document +class IndividualCharacteristicaDocument(Document): + """ Characteristica elastic search document. """ + study_sid = string_field('study_sid') + study_name = string_field('study_name') + + + # individual related + individual_pk = fields.IntegerField(attr='individual_pk') + individual_name = fields.StringField( + attr='individual_name', + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + individual_group_pk = fields.IntegerField( + attr='individual_group_pk', + ) + characteristica_pk = fields.IntegerField( + attr='characteristica_pk', + ) + count = fields.IntegerField() + + measurement_type = fields.StringField( + attr='measurement_type', + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + choice = fields.StringField( + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + unit = fields.StringField( + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + substance = fields.StringField( + attr='substance', + fields={ + 'raw': fields.StringField(analyzer='keyword'), + } + ) + value = fields.FloatField(attr='value') + mean = fields.FloatField(attr='mean') + median = fields.FloatField(attr='median') + min = fields.FloatField(attr='min') + max = fields.FloatField(attr='max') + se = fields.FloatField(attr='se') + sd = fields.FloatField(attr='sd') + cv = fields.FloatField(attr='cv') + + access = string_field('access') + allowed_users = fields.ObjectField( + attr="allowed_users", + properties={ + 'username': string_field("username") + }, + multi=True + ) + + class Django: + model = IndividualCharacteristica + # Ignore auto updating of Elasticsearch when a model is saved/deleted: + ignore_signals = True + # Don't perform an index refresh after every update + auto_refresh = False + + class Index: + name = "individual_characteristica" + settings = {**elastic_settings, 'max_result_window': 50000} + + + def get_queryset(self): + """Not mandatory but to improve performance we can select related in one sql request""" + return super(IndividualCharacteristicaDocument, self).get_queryset().select_related( + 'individual','characteristica') diff --git a/backend/pkdb_app/subjects/managers.py b/backend/pkdb_app/subjects/managers.py index b28e4500..cde4ec8c 100644 --- a/backend/pkdb_app/subjects/managers.py +++ b/backend/pkdb_app/subjects/managers.py @@ -133,6 +133,7 @@ def create(self, *args, **kwargs): # add characteristica from parents to the all_characteristica_normed if each individual for individual in individualset.individuals: + #print(individual._characteristica_all_normed.all()) individual.characteristica_all_normed.add(*individual._characteristica_all_normed) return individualset diff --git a/backend/pkdb_app/subjects/models.py b/backend/pkdb_app/subjects/models.py index 3a68d1a1..79a4341b 100644 --- a/backend/pkdb_app/subjects/models.py +++ b/backend/pkdb_app/subjects/models.py @@ -149,6 +149,7 @@ class Group(Accessible): def study(self): return self.ex.groupset.study + @property def source(self): return self.ex.source @@ -420,7 +421,8 @@ def individual_group_pk(self): return self.individual.group.pk -class SubjectCharacteristica(Accessible,models.Model): +class SubjectCharacteristica(models.Model): + class Meta: abstract = True @@ -446,14 +448,14 @@ def measurement_type(self): return self.characteristica.measurement_type.name - @property def choice(self): return self.characteristica.choice @property def substance(self): - return self.characteristica.substance.name + if self.characteristica.substance: + return self.characteristica.substance.name @property def unit(self): @@ -493,7 +495,7 @@ def cv(self): -class GroupCharacteristica(SubjectCharacteristica): +class GroupCharacteristica(Accessible,SubjectCharacteristica): characteristica = models.ForeignKey(Characteristica, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) @@ -525,7 +527,9 @@ def group_count(self): -class IndividualCharacteristica(SubjectCharacteristica): + + +class IndividualCharacteristica(Accessible,SubjectCharacteristica): characteristica = models.ForeignKey(Characteristica, on_delete=models.CASCADE) individual = models.ForeignKey(Individual, on_delete=models.CASCADE) @@ -542,7 +546,7 @@ def individual_pk(self): @property def individual_name(self): - return self.individual.pk + return self.individual.name @property def individual_group_pk(self): diff --git a/backend/pkdb_app/subjects/views.py b/backend/pkdb_app/subjects/views.py index 16a78fbd..d7bce31f 100644 --- a/backend/pkdb_app/subjects/views.py +++ b/backend/pkdb_app/subjects/views.py @@ -14,7 +14,8 @@ IndividualElasticSerializer, GroupElasticSerializer, CharacteristicaElasticBigSerializer, CharacteristicaElasticSerializer, GroupCharacteristicaSerializer, IndividualCharacteristicaSerializer) -from pkdb_app.subjects.documents import IndividualDocument, CharacteristicaDocument, GroupDocument +from pkdb_app.subjects.documents import IndividualDocument, CharacteristicaDocument, GroupDocument, \ + GroupCharacteristicaDocument, IndividualCharacteristicaDocument ############################################################ #Elastic Search Views ########################################################### @@ -57,6 +58,7 @@ class GroupViewSet(AccessView): # Filter fields filter_fields = { 'id': 'id', + 'pk': 'pk', 'name': 'name.raw', 'parent': 'group.name.raw', 'study': 'study.raw', @@ -98,10 +100,12 @@ class IndividualViewSet(AccessView): # Filter fields filter_fields = { + 'pk': 'pk', 'id': 'id', 'name': 'name.raw', - 'group': 'group.name.raw', - 'study': 'study.name.raw', + 'group_name': 'group.name.raw', + 'study': 'study.raw', + } # Define ordering fields @@ -116,7 +120,7 @@ class IndividualViewSet(AccessView): class CharacteristicaElasticViewSet(AccessView): pagination_class = CustomPagination - document = CharacteristicaDocument + document = GroupCharacteristica serializer_class = CharacteristicaElasticBigSerializer lookup_field = 'id' filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend] @@ -152,60 +156,34 @@ class CharacteristicaElasticViewSet(AccessView): 'study_sid': 'study_sid', } -class GroupCharacteristicaViewSet(viewsets.ModelViewSet): - queryset = GroupCharacteristica.objects.all().select_related('group', 'characteristica','group__ex__groupset__study',) +class GroupCharacteristicaViewSet(AccessView): + document = GroupCharacteristicaDocument serializer_class = GroupCharacteristicaSerializer - model = GroupCharacteristica - - # filter_fields = { - # 'characteristica_pk': 'characteristica_pk', - # 'group_pk': 'group_pk', - # } - - ''' 'raw_pk':'raw_pk', - 'normed': 'normed', - 'study_sid': 'study_sid', - 'study_name': 'study_name', - 'name': 'name', - 'count':'count', - 'measurement_type':'measurement_type', - 'choice': 'choice', - 'substance': 'substance', - 'value': 'value', - 'mean': 'mean', - 'median': 'median', - 'min': 'min', - 'max': 'max', - 'se': 'se', - 'sd': 'sd', - 'cv': 'cv', - 'group_pk': 'group_pk', - 'group_name': 'group_name', - 'group_count': 'group_count', - 'group_parent_pk': 'group_parent_pk', + pagination_class = CustomPagination + lookup_field = 'id' + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] + + search_fields = ( + 'choice', + ) + multi_match_search_fields = {field: {"boost": 1} for field in search_fields} + multi_match_options = { + 'operator': 'and' } - - ''' -class IndividualCharacteristicaViewSet(viewsets.ModelViewSet): - queryset = IndividualCharacteristica.objects.all().select_related('individual', 'characteristica','individual__ex__individualset__study',) - serializer_class = IndividualCharacteristicaSerializer - model = IndividualCharacteristica -# -# filter_fields = { -# 'characteristica_pk': 'characteristica_pk', -# 'individual_pk': 'individual_pk', -# } - """" - 'raw_pk':'raw_pk', - 'normed': 'normed', - 'study_sid': 'study_sid', - 'study_name': 'study_name', - 'name': 'name', - 'count':'count', - 'measurement_type':'measurement_type', - 'choice': 'choice', - 'substance': 'substance', + + filter_fields = { + 'study_sid': 'study_sid.raw', + 'study_name': 'study_name.raw', + 'group_pk': 'group_pk', + 'group_name': 'group_name', + 'group_count': 'group_count', + 'group_parent_pk': 'group_parent_pk', + 'characteristica_pk': 'characteristica_pk', + 'count': 'count', + 'measurement_type': 'measurement_type.raw', + 'choice': 'choice.raw', + 'substance': 'substance.raw', 'value': 'value', 'mean': 'mean', 'median': 'median', @@ -214,10 +192,58 @@ class IndividualCharacteristicaViewSet(viewsets.ModelViewSet): 'se': 'se', 'sd': 'sd', 'cv': 'cv', + 'unit':'unit.raw', + } + ordering_fields = { + 'choice': 'choice.raw', + "count": 'count', + } + + + +class IndividualCharacteristicaViewSet(AccessView): + document = IndividualCharacteristicaDocument + serializer_class = IndividualCharacteristicaSerializer + pagination_class = CustomPagination + lookup_field = 'id' + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] + + search_fields = ( + 'choice', + ) + multi_match_search_fields = {field: {"boost": 1} for field in search_fields} + multi_match_options = { + 'operator': 'and' + } + + filter_fields = { + 'study_sid': 'study_sid.raw', + 'study_name': 'study_name.raw', + + 'individual_pk': 'individual_pk', 'individual_name': 'individual_name', 'individual_group_pk': 'individual_group_pk', + + 'characteristica_pk': 'characteristica_pk', + 'count': 'count', + 'measurement_type': 'measurement_type.raw', + 'choice': 'choice.raw', + 'substance': 'substance.raw', + 'value': 'value', + 'mean': 'mean', + 'median': 'median', + 'min': 'min', + 'max': 'max', + 'se': 'se', + 'sd': 'sd', + 'cv': 'cv', + 'unit': 'unit.raw', } - """ + ordering_fields = { + 'choice': 'choice.raw', + "count": 'count', + } + ############################################################ #Views queried not from elastic search diff --git a/backend/pkdb_app/utils.py b/backend/pkdb_app/utils.py index 07e32b13..4b1b8344 100644 --- a/backend/pkdb_app/utils.py +++ b/backend/pkdb_app/utils.py @@ -132,6 +132,7 @@ def initialize_normed(notnorm_instance): norm.normed = True norm.normalize() norm.raw_id = notnorm_instance.pk + try: norm.individual_id = notnorm_instance.individual.pk From 4260e728bbffc257db063fc083db47d74a73dfad Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Wed, 23 Oct 2019 19:24:46 +0200 Subject: [PATCH 07/19] added filter on interventions --- backend/pkdb_app/interventions/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/pkdb_app/interventions/views.py b/backend/pkdb_app/interventions/views.py index f6fbcc07..d88c5ff0 100644 --- a/backend/pkdb_app/interventions/views.py +++ b/backend/pkdb_app/interventions/views.py @@ -55,7 +55,7 @@ class ElasticInterventionViewSet(AccessView): } filter_fields = { 'pk': 'pk', - 'study_sid': 'study_sid', + 'study_sid': 'study_sid.raw', 'study_name': 'study_name.raw', 'normed':'normed', 'raw_pk': 'raw_pk', From 74e211836767a0864cbc6c9fbf827bd50b18cbd6 Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Fri, 25 Oct 2019 10:50:47 +0200 Subject: [PATCH 08/19] on analysis views --- backend/pkdb_app/interventions/views.py | 26 ++++- backend/pkdb_app/outputs/views.py | 144 +++++++++++------------- backend/pkdb_app/subjects/views.py | 103 ++++++++++++++--- backend/pkdb_app/urls.py | 3 +- 4 files changed, 176 insertions(+), 100 deletions(-) diff --git a/backend/pkdb_app/interventions/views.py b/backend/pkdb_app/interventions/views.py index d88c5ff0..a4177f78 100644 --- a/backend/pkdb_app/interventions/views.py +++ b/backend/pkdb_app/interventions/views.py @@ -1,5 +1,6 @@ import pandas as pd from django.urls import reverse +from django_elasticsearch_dsl_drf.constants import LOOKUP_QUERY_IN, LOOKUP_QUERY_EXCLUDE from django_elasticsearch_dsl_drf.filter_backends import FilteringFilterBackend, \ OrderingFilterBackend, IdsFilterBackend, MultiMatchSearchFilterBackend from pkdb_app.categorials.models import MeasurementType, Route, Form, Application @@ -54,9 +55,28 @@ class ElasticInterventionViewSet(AccessView): 'operator': 'and' } filter_fields = { - 'pk': 'pk', - 'study_sid': 'study_sid.raw', - 'study_name': 'study_name.raw', + + 'study_sid': {'field': 'study_sid.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'study_name': {'field': 'study_name.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'pk': {'field': 'pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, 'normed':'normed', 'raw_pk': 'raw_pk', 'name': 'name.raw', diff --git a/backend/pkdb_app/outputs/views.py b/backend/pkdb_app/outputs/views.py index 79ec2e09..6681341b 100644 --- a/backend/pkdb_app/outputs/views.py +++ b/backend/pkdb_app/outputs/views.py @@ -1,5 +1,5 @@ from django.urls import reverse -from django_elasticsearch_dsl_drf.constants import LOOKUP_QUERY_IN +from django_elasticsearch_dsl_drf.constants import LOOKUP_QUERY_IN, LOOKUP_QUERY_EXCLUDE from django_elasticsearch_dsl_drf.filter_backends import FilteringFilterBackend, \ OrderingFilterBackend, IdsFilterBackend, MultiMatchSearchFilterBackend from pkdb_app.categorials.models import MeasurementType, Tissue @@ -119,27 +119,43 @@ class OutputInterventionViewSet(AccessView): 'operator': 'and' } filter_fields = { - 'study_name': 'study_name.raw', - 'study_sid': 'study_sid.raw', + 'study_sid': {'field': 'study_sid.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'study_name': {'field': 'study_name.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, 'output_pk': {'field': 'output_pk', 'lookups': [ LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, ], }, 'intervention_pk': {'field': 'intervention_pk', 'lookups': [ LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, ], }, 'group_pk': {'field': 'group_pk', 'lookups': [ LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, ], }, 'individual_pk': {'field': 'individual_pk', 'lookups': [ LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, ]}, 'normed': 'normed', 'calculated': 'calculated', @@ -148,7 +164,6 @@ class OutputInterventionViewSet(AccessView): 'time_unit': 'time_unit.raw', 'measurement_type': 'measurement_type.raw', 'substance': 'substance.raw', - 'choice': 'choice.raw', 'unit': 'unit.raw', @@ -177,35 +192,51 @@ class TimecourseInterventionViewSet(AccessView): 'operator': 'and' } filter_fields = { - 'study_name': 'study_name.raw', - 'study_sid': 'study_sid.raw', + 'study_sid': {'field': 'study_sid.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, + 'study_name': {'field': 'study_name.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, + 'tissue': "tissue.raw", + 'time': 'time.raw', + 'time_unit': 'time_unit.raw', + 'choice': 'choice.raw', + 'normed': 'normed', + 'unit': 'unit.raw', + 'substance': 'substance.raw', + 'measurement_type': 'measurement_type.raw', + 'group_pk': {'field': 'group_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, + 'timecourse_pk': {'field': 'timecourse_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'individual_pk': {'field': 'individual_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, - 'tissue': "tissue.raw", - 'time': 'time.raw', - 'choice': 'choice.raw', - 'normed': 'normed', - 'unit': 'unit', - 'substance': 'substance', - 'measurement_type': 'measurement_type.raw', - 'group_pk': {'field': 'group_pk', - 'lookups': [ - LOOKUP_QUERY_IN, - ], - }, - 'timecourse_pk': {'field': 'timecourse_pk', - 'lookups': [ - LOOKUP_QUERY_IN, - ], - }, - 'individual_pk': {'field': 'individual_pk', - 'lookups': [ - LOOKUP_QUERY_IN, - ]}, - 'intervention_pk': {'field': 'intervention_pk', - 'lookups': [ - LOOKUP_QUERY_IN, - ], - }} + ]}, + 'intervention_pk': {'field': 'intervention_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }} ordering_fields = {'measurement_type': 'measurement_type.raw', 'tissue': 'tissue.raw', 'substance': 'substance.raw', @@ -213,55 +244,6 @@ class TimecourseInterventionViewSet(AccessView): 'individual_name': 'individual_name.raw', } -class OutputAnalysisViewSet(ElasticOutputViewSet): - #pagination_class = None - #paginator = None - #PAGE_SIZE = 10000 - - #def paginate_queryset(self, queryset): - # return None - - def list(self, request, *args, **kwargs): - results = super().list(request, *args, **kwargs) - - df = pd.DataFrame(results.data["data"]["data"]) - #df = pd.DataFrame(results.data) - #print(len(df)) - - lst_col = "interventions" - df = pd.DataFrame({col: np.repeat(df[col].values, df[lst_col].str.len()) - for col in df.columns.difference([lst_col])}).assign( - **{lst_col: np.concatenate(df[lst_col].values)})[df.columns.tolist()] - - df["intervention_pk"] = df["interventions"].apply(lambda intervention: intervention.get("pk",None)) - - def get_pk(data): - if isinstance(data,dict): - return data.get("pk",None) - - - df["group_pk"] = df["group"].apply(get_pk) - df["individual_pk"] = df["individual"].apply(get_pk) - df["timecourse_pk"] = df["timecourse"].apply(get_pk) - df["individual_pk"] = df["individual"].apply(get_pk) - - df = df.where(df.notnull(), None) - - del df["raw"] - del df["timecourse"] - del df["interventions"] - del df["individual"] - del df["group"] - del df["allowed_users"] - - - results.data["data"]["data"] = df.to_dict('records') - del results.data["data"]["count"] - #results.data = df.to_dict('records') - return results - - - class ElasticTimecourseViewSet(AccessView): document = TimecourseDocument diff --git a/backend/pkdb_app/subjects/views.py b/backend/pkdb_app/subjects/views.py index d7bce31f..994bcaa1 100644 --- a/backend/pkdb_app/subjects/views.py +++ b/backend/pkdb_app/subjects/views.py @@ -1,3 +1,4 @@ +from django_elasticsearch_dsl_drf.constants import LOOKUP_QUERY_IN, LOOKUP_QUERY_EXCLUDE from elasticsearch_dsl import Q from pkdb_app.categorials.models import MeasurementType @@ -173,13 +174,52 @@ class GroupCharacteristicaViewSet(AccessView): filter_fields = { - 'study_sid': 'study_sid.raw', - 'study_name': 'study_name.raw', - 'group_pk': 'group_pk', - 'group_name': 'group_name', + + 'study_sid': {'field': 'study_sid.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'study_name': {'field': 'study_name.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'group_name': {'field': 'group_name', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + + 'group_pk': {'field': 'group_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'group_parent_pk': {'field': 'group_parent_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'characteristica_pk': {'field': 'characteristica_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'group_count': 'group_count', - 'group_parent_pk': 'group_parent_pk', - 'characteristica_pk': 'characteristica_pk', 'count': 'count', 'measurement_type': 'measurement_type.raw', 'choice': 'choice.raw', @@ -217,14 +257,49 @@ class IndividualCharacteristicaViewSet(AccessView): } filter_fields = { - 'study_sid': 'study_sid.raw', - 'study_name': 'study_name.raw', - - 'individual_pk': 'individual_pk', - 'individual_name': 'individual_name', - 'individual_group_pk': 'individual_group_pk', - - 'characteristica_pk': 'characteristica_pk', + 'study_sid': { + 'field': 'study_sid.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, + 'study_name': { + 'field': 'study_name.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, + 'individual_name': { + 'field': 'individual_name', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, + 'individual_pk': { + 'field': 'individual_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, + 'individual_group_pk': { + 'field': 'individual_group_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, + 'characteristica_pk': { + 'field': 'characteristica_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, 'count': 'count', 'measurement_type': 'measurement_type.raw', 'choice': 'choice.raw', diff --git a/backend/pkdb_app/urls.py b/backend/pkdb_app/urls.py index 5fb03f1e..a960cd24 100755 --- a/backend/pkdb_app/urls.py +++ b/backend/pkdb_app/urls.py @@ -7,7 +7,7 @@ from pkdb_app.categorials.views import MeasurementTypeViewSet, MeasurementTypeElasticViewSet, TissueViewSet, \ ApplicationViewSet, FormViewSet, RouteViewSet from pkdb_app.outputs.views import ElasticTimecourseViewSet, ElasticOutputViewSet, OutputOptionViewSet, \ - TimecourseOptionViewSet, OutputAnalysisViewSet, OutputInterventionViewSet, \ + TimecourseOptionViewSet, OutputInterventionViewSet, \ TimecourseInterventionViewSet from pkdb_app.substances.views import SubstanceViewSet, ElasticSubstanceViewSet, SubstanceStatisticsViewSet from rest_framework.authtoken.views import obtain_auth_token @@ -84,7 +84,6 @@ router.register("interventions_elastic", ElasticInterventionViewSet, base_name="interventions_elastic") router.register("timecourses_elastic", ElasticTimecourseViewSet, base_name="timecourses_elastic") router.register("outputs_elastic", ElasticOutputViewSet, base_name="outputs_elastic") -#router.register("outputs_analysis", OutputAnalysisViewSet, base_name="outputs_analysis") router.register("output_intervention", OutputInterventionViewSet, base_name="output_intervention") router.register("timecourse_intervention", TimecourseInterventionViewSet, base_name="timecourse_intervention") From 7ba3e340c6ccfa0d8ae1798c2211a98bc12249f2 Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Fri, 25 Oct 2019 15:26:39 +0200 Subject: [PATCH 09/19] analysis querys --- backend/pkdb_app/subjects/models.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/backend/pkdb_app/subjects/models.py b/backend/pkdb_app/subjects/models.py index 79a4341b..be686a4f 100644 --- a/backend/pkdb_app/subjects/models.py +++ b/backend/pkdb_app/subjects/models.py @@ -29,6 +29,8 @@ SUBJECT_TYPE_GROUP = "group" SUBJECT_TYPE_INDIVIDUAL = "individual" +ADDITIVE_CHARACTERISTICA = ["disease", "abstinence"] + # ---------------------------------- # DataFile # ---------------------------------- @@ -167,12 +169,11 @@ def parents(self): @property def _characteristica_all(self): - characteristica_all = self.characteristica.all() - additive_characteristica = ["disease","abstinence"] - this_measurements = characteristica_all.exclude(measurement_type__name__in=additive_characteristica).values_list("measurement_type", flat=True) + _characteristica_all = self.characteristica.all() + this_measurements = _characteristica_all.exclude(measurement_type__name__in=ADDITIVE_CHARACTERISTICA).values_list("measurement_type", flat=True) if self.parent: - characteristica_all = characteristica_all | self.parent._characteristica_all.exclude(measurement_type__in=this_measurements) - return characteristica_all + _characteristica_all = _characteristica_all | self.parent._characteristica_all.exclude(measurement_type__in=this_measurements) + return _characteristica_all @property def _characteristica_all_normed(self): @@ -271,11 +272,18 @@ def _characteristica_normed(self): @property def _characteristica_all_normed(self): - characteristica_normed = self._characteristica_normed + _characteristica_normed = self._characteristica_normed # charcteristica from related groups with the same measurement type as these used in the individual are excluded. - this_measurements = characteristica_normed.values_list("measurement_type", flat=True) - return (characteristica_normed | self.group.characteristica_all_normed.exclude(measurement_type__in=this_measurements)) + #this_measurements = characteristica_normed.values_list("measurement_type", flat=True) + this_measurements = _characteristica_normed.exclude(measurement_type__name__in=ADDITIVE_CHARACTERISTICA).values_list("measurement_type", flat=True) + print("*"*100) + print(this_measurements.all()) + print(len(self.group._characteristica_all_normed)) + print(len(self.group._characteristica_all_normed.exclude(measurement_type__in=this_measurements))) + print("*"*100) + + return (_characteristica_normed | self.group._characteristica_all_normed.exclude(measurement_type__in=this_measurements)) @property def study(self): From 99bdfff57a7d5c43103a3c0f2e22048c1cacc6aa Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Mon, 28 Oct 2019 10:26:08 +0100 Subject: [PATCH 10/19] bug in renaming sid --- backend/pkdb_app/outputs/models.py | 8 ++++---- backend/pkdb_app/storage.py | 1 + backend/pkdb_app/studies/models.py | 3 +++ backend/pkdb_app/studies/views.py | 16 +++++++++++----- backend/pkdb_app/subjects/models.py | 9 +++++---- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/backend/pkdb_app/outputs/models.py b/backend/pkdb_app/outputs/models.py index 91f105b9..ab4ff65a 100644 --- a/backend/pkdb_app/outputs/models.py +++ b/backend/pkdb_app/outputs/models.py @@ -96,10 +96,10 @@ class OutputEx(Externable, ExMeasurementTypeable ): source = models.ForeignKey( - DataFile, related_name="s_output_exs", null=True, on_delete=models.CASCADE + DataFile, related_name="s_output_exs", null=True, on_delete=models.SET_NULL ) figure = models.ForeignKey( - DataFile, related_name="f_output_exs", null=True, on_delete=models.CASCADE + DataFile, related_name="f_output_exs", null=True, on_delete=models.SET_NULL ) outputset = models.ForeignKey( OutputSet, related_name="output_exs", on_delete=models.CASCADE, null=True @@ -240,10 +240,10 @@ class TimecourseEx( time """ source = models.ForeignKey( - DataFile, related_name="s_timecourse_exs", null=True, on_delete=models.CASCADE + DataFile, related_name="s_timecourse_exs", null=True, on_delete=models.SET_NULL ) figure = models.ForeignKey( - DataFile, related_name="f_timecourse_exs", null=True, on_delete=models.CASCADE + DataFile, related_name="f_timecourse_exs", null=True, on_delete=models.SET_NULL ) outputset = models.ForeignKey( OutputSet, related_name="timecourse_exs", on_delete=models.CASCADE, null=True diff --git a/backend/pkdb_app/storage.py b/backend/pkdb_app/storage.py index 21011906..f087f147 100644 --- a/backend/pkdb_app/storage.py +++ b/backend/pkdb_app/storage.py @@ -8,3 +8,4 @@ def get_available_name(self, name, max_length=None): os.remove(self.path(name)) return name + diff --git a/backend/pkdb_app/studies/models.py b/backend/pkdb_app/studies/models.py index 6e359e18..d87b3b52 100644 --- a/backend/pkdb_app/studies/models.py +++ b/backend/pkdb_app/studies/models.py @@ -289,6 +289,7 @@ def output_calculated_count(self): return 0 def delete(self, *args, **kwargs): + print("here I am") if self.outputset: self.outputset.delete() if self.interventionset: @@ -297,6 +298,8 @@ def delete(self, *args, **kwargs): self.individualset.delete() if self.groupset: self.groupset.delete() + if self.reference: + self.reference.delete() super().delete(*args, **kwargs) diff --git a/backend/pkdb_app/studies/views.py b/backend/pkdb_app/studies/views.py index d3f42ad6..176c81ac 100644 --- a/backend/pkdb_app/studies/views.py +++ b/backend/pkdb_app/studies/views.py @@ -140,11 +140,14 @@ def create(self, request, *args, **kwargs): return super().create(request, *args, **kwargs) def destroy(self, request, *args, **kwargs): + + # if get object does not find an object it stops here + instance = self.get_object() + related_elastic = related_elastic_dict(instance) delete_elastic_study(related_elastic) - - return super().destroy(request) + return super().destroy(request,*args, **kwargs) ############################################################################################### @@ -153,6 +156,7 @@ def destroy(self, request, *args, **kwargs): @csrf_exempt def update_index_study(request): + if request.method == 'POST': data = JSONParser().parse(request) try: @@ -189,7 +193,8 @@ def related_elastic_dict(study): interventions = study.interventions.all() groups = study.groups.all() individuals = study.individuals.all() - + outputs = study.outputs.all() + timecourses = study.timecourses.all() docs_dict = { StudyDocument: study, GroupDocument: groups, @@ -197,11 +202,12 @@ def related_elastic_dict(study): CharacteristicaDocument: study.characteristica, GroupCharacteristicaDocument: GroupCharacteristica.objects.filter(group__in=groups), IndividualCharacteristicaDocument: IndividualCharacteristica.objects.filter(individual__in=individuals), + TimecourseInterventionDocument: TimecourseIntervention.objects.filter(timecourse__in=timecourses), + OutputInterventionDocument: OutputIntervention.objects.filter(output__in=outputs), InterventionDocument: interventions, OutputDocument: study.outputs, TimecourseDocument: study.timecourses, - TimecourseInterventionDocument: TimecourseIntervention.objects.filter(intervention__in=interventions), - OutputInterventionDocument: OutputIntervention.objects.filter(intervention__in=interventions), + } if study.reference: diff --git a/backend/pkdb_app/subjects/models.py b/backend/pkdb_app/subjects/models.py index be686a4f..0351d5ba 100644 --- a/backend/pkdb_app/subjects/models.py +++ b/backend/pkdb_app/subjects/models.py @@ -60,6 +60,7 @@ def timecourses(self): def __str__(self): return self.file.name + # ---------------------------------- # Group # ---------------------------------- @@ -101,10 +102,10 @@ class GroupEx(Externable, AbstractGroup): """ source = models.ForeignKey( - DataFile, related_name="s_group_exs", null=True, on_delete=models.CASCADE + DataFile, related_name="s_group_exs", null=True, on_delete=models.SET_NULL ) figure = models.ForeignKey( - DataFile, related_name="f_group_exs", null=True, on_delete=models.CASCADE + DataFile, related_name="f_group_exs", null=True, on_delete=models.SET_NULL ) groupset = models.ForeignKey( GroupSet, on_delete=models.CASCADE, null=True, related_name="group_exs" @@ -215,8 +216,8 @@ class IndividualEx(Externable, AbstractIndividual): Individuals are defined via their characteristics, analogue to groups. """ - source = models.ForeignKey( DataFile, related_name="s_individual_exs", null=True, on_delete=models.CASCADE) - figure = models.ForeignKey(DataFile, related_name="f_individual_exs", null=True, on_delete=models.CASCADE) + source = models.ForeignKey( DataFile, related_name="s_individual_exs", null=True, on_delete=models.SET_NULL) + figure = models.ForeignKey(DataFile, related_name="f_individual_exs", null=True, on_delete=models.SET_NULL) individualset = models.ForeignKey(IndividualSet, on_delete=models.CASCADE, related_name="individual_exs") group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name="individual_exs", null=True) group_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) From 87fd426b79debf109773b68fdeabbeb097385997 Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Mon, 28 Oct 2019 10:45:25 +0100 Subject: [PATCH 11/19] debuging left overs --- backend/pkdb_app/studies/models.py | 1 - backend/pkdb_app/subjects/models.py | 6 ------ 2 files changed, 7 deletions(-) diff --git a/backend/pkdb_app/studies/models.py b/backend/pkdb_app/studies/models.py index d87b3b52..03525798 100644 --- a/backend/pkdb_app/studies/models.py +++ b/backend/pkdb_app/studies/models.py @@ -289,7 +289,6 @@ def output_calculated_count(self): return 0 def delete(self, *args, **kwargs): - print("here I am") if self.outputset: self.outputset.delete() if self.interventionset: diff --git a/backend/pkdb_app/subjects/models.py b/backend/pkdb_app/subjects/models.py index 0351d5ba..5af0e64d 100644 --- a/backend/pkdb_app/subjects/models.py +++ b/backend/pkdb_app/subjects/models.py @@ -278,12 +278,6 @@ def _characteristica_all_normed(self): # charcteristica from related groups with the same measurement type as these used in the individual are excluded. #this_measurements = characteristica_normed.values_list("measurement_type", flat=True) this_measurements = _characteristica_normed.exclude(measurement_type__name__in=ADDITIVE_CHARACTERISTICA).values_list("measurement_type", flat=True) - print("*"*100) - print(this_measurements.all()) - print(len(self.group._characteristica_all_normed)) - print(len(self.group._characteristica_all_normed.exclude(measurement_type__in=this_measurements))) - print("*"*100) - return (_characteristica_normed | self.group._characteristica_all_normed.exclude(measurement_type__in=this_measurements)) @property From ce624a17e63e19f1d3a44526ac8318cad2590bbf Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Mon, 28 Oct 2019 17:06:36 +0100 Subject: [PATCH 12/19] work on queries --- backend/pkdb_app/interventions/serializers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/pkdb_app/interventions/serializers.py b/backend/pkdb_app/interventions/serializers.py index bdc3f065..f5daadac 100644 --- a/backend/pkdb_app/interventions/serializers.py +++ b/backend/pkdb_app/interventions/serializers.py @@ -246,6 +246,7 @@ class Meta: class InterventionElasticSerializer(serializers.ModelSerializer): + intervention_pk = serializers.IntegerField(source="pk") substance = serializers.CharField(allow_null=True) measurement_type = serializers.CharField() route = serializers.CharField() @@ -262,7 +263,7 @@ class InterventionElasticSerializer(serializers.ModelSerializer): class Meta: model = Intervention - fields = ["study_sid","study_name", "pk","raw_pk", "normed"] + INTERVENTION_FIELDS + MEASUREMENTTYPE_FIELDS + fields = ["study_sid","study_name", "intervention_pk","raw_pk", "normed"] + INTERVENTION_FIELDS + MEASUREMENTTYPE_FIELDS def to_representation(self, instance): From 4cd5331ed06c34670f3f569273f6afb8d461832e Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Tue, 29 Oct 2019 13:03:23 +0100 Subject: [PATCH 13/19] filter option on studies --- backend/pkdb_app/interventions/views.py | 1 - backend/pkdb_app/studies/views.py | 16 +++++++--------- backend/pkdb_app/subjects/models.py | 1 - 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/backend/pkdb_app/interventions/views.py b/backend/pkdb_app/interventions/views.py index a4177f78..e26b8e1d 100644 --- a/backend/pkdb_app/interventions/views.py +++ b/backend/pkdb_app/interventions/views.py @@ -1,4 +1,3 @@ -import pandas as pd from django.urls import reverse from django_elasticsearch_dsl_drf.constants import LOOKUP_QUERY_IN, LOOKUP_QUERY_EXCLUDE from django_elasticsearch_dsl_drf.filter_backends import FilteringFilterBackend, \ diff --git a/backend/pkdb_app/studies/views.py b/backend/pkdb_app/studies/views.py index 176c81ac..d3b72161 100644 --- a/backend/pkdb_app/studies/views.py +++ b/backend/pkdb_app/studies/views.py @@ -235,7 +235,6 @@ class ElasticStudyViewSet(DocumentViewSet): 'curators.user', 'name', - 'design', 'reference', 'substances', 'files', @@ -245,16 +244,15 @@ class ElasticStudyViewSet(DocumentViewSet): 'operator': 'and' } - filter_fields = {'sid':'sid.raw','name': 'name.raw', "substances": "substances"} + filter_fields = { + 'sid':'sid.raw', + 'name': 'name.raw', + 'licence': 'licence.raw', + 'access': 'access.raw', + 'substances': 'substances.raw', + } ordering_fields = { 'sid': 'sid', - "pk": 'pk', - "pk_version":'pk_version', - "name":"name", - "design": "design.raw", - "reference": "reference.raw", - "creator":"creator.last_name", - } def get_object(self): diff --git a/backend/pkdb_app/subjects/models.py b/backend/pkdb_app/subjects/models.py index 5af0e64d..3b00e033 100644 --- a/backend/pkdb_app/subjects/models.py +++ b/backend/pkdb_app/subjects/models.py @@ -181,7 +181,6 @@ def _characteristica_all_normed(self): return self._characteristica_all.filter(normed=True) - # ---------------------------------- # Individual # ---------------------------------- From 169db8be8954e2cef19c5509290d1d27da465e3e Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Wed, 30 Oct 2019 10:42:10 +0100 Subject: [PATCH 14/19] closes #455 closes #454 --- backend/pkdb_app/studies/models.py | 2 +- backend/pkdb_app/studies/views.py | 6 ++++-- backend/pkdb_app/subjects/serializers.py | 16 +++++++++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/backend/pkdb_app/studies/models.py b/backend/pkdb_app/studies/models.py index 03525798..bbcf4358 100644 --- a/backend/pkdb_app/studies/models.py +++ b/backend/pkdb_app/studies/models.py @@ -99,7 +99,7 @@ class Study(Sidable, models.Model): """ sid = models.CharField(max_length=CHAR_MAX_LENGTH, unique=True) pkdb_version = models.IntegerField(default=CURRENT_VERSION) - name = models.CharField(max_length=CHAR_MAX_LENGTH) + name = models.CharField(max_length=CHAR_MAX_LENGTH, unique=True) access = models.CharField(max_length=CHAR_MAX_LENGTH, choices=STUDY_ACCESS_CHOICES) reference = models.OneToOneField( diff --git a/backend/pkdb_app/studies/views.py b/backend/pkdb_app/studies/views.py index d3b72161..1c51dc0c 100644 --- a/backend/pkdb_app/studies/views.py +++ b/backend/pkdb_app/studies/views.py @@ -107,14 +107,16 @@ def group_validation(request): raise ValidationError({"groups": "parent is not allowed for group all"}) elif group_name != "all" and parent_name is None: - raise ValidationError({"groups":"parent is required for keyword in groups besides for the the group"}) + raise ValidationError({"groups":"parent is required for keyword in groups besides for the group"}) if "all" not in groups_name: raise ValidationError( {"group": "A group with the name `all` is missing (studies without such a group cannot be uploaded). " "The `all` group is the group of all subjects which was studied and defines common " - "characteristica for all groups and individuals. Create the `all` group or rename group to `all`." + "characteristica for all groups and individuals. Species information are requirement " + "on the all group. Create the `all` group or rename group to `all`. " + } ) diff --git a/backend/pkdb_app/subjects/serializers.py b/backend/pkdb_app/subjects/serializers.py index d9509f4a..ac04c3dd 100644 --- a/backend/pkdb_app/subjects/serializers.py +++ b/backend/pkdb_app/subjects/serializers.py @@ -35,6 +35,8 @@ EXTERN_FILE_FIELDS = ["source", "subset_map","groupby", "figure", "source_map", "figure_map"] + +#todo: move datafile from subjects module # ---------------------------------- # DataFile # ---------------------------------- @@ -124,13 +126,25 @@ def to_internal_value(self, data): self.validate_wrong_keys(data) _validate_requried_key(data,"count") - for characteristica_single in data.get("characteristica",[]): disabled = ["value"] self._validate_disabled_data(characteristica_single, disabled) return super(serializers.ModelSerializer, self).to_internal_value(data) + def validate(self, attrs): + """ validates species information on group with name all + :param attrs: + :return: + """ + if attrs.get("name") == "all": + is_species = [characteristica_single.get("measurement_type").name == "species" for characteristica_single in attrs.get("characteristica", [])] + if not any(is_species): + raise serializers.ValidationError( + {"characteristica": "A characteristica with `'measurement_type' = 'species'` is required on the `all` group.", + "details":attrs}) + return super().validate(attrs) + def to_representation(self, instance): rep = super().to_representation(instance) From 4f0b1bca9083a6d364637d5142ba6c946fe4d9b7 Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Wed, 30 Oct 2019 11:26:19 +0100 Subject: [PATCH 15/19] closes #453 --- backend/pkdb_app/comments/models.py | 30 +++++++++++++++---- backend/pkdb_app/interventions/managers.py | 2 ++ backend/pkdb_app/interventions/serializers.py | 11 ++++--- backend/pkdb_app/outputs/managers.py | 7 +++++ backend/pkdb_app/outputs/serializers.py | 13 +++++++- backend/pkdb_app/subjects/managers.py | 14 +++++++-- backend/pkdb_app/subjects/serializers.py | 18 +++++++++-- 7 files changed, 79 insertions(+), 16 deletions(-) diff --git a/backend/pkdb_app/comments/models.py b/backend/pkdb_app/comments/models.py index f9c781a1..ad7b6c5d 100644 --- a/backend/pkdb_app/comments/models.py +++ b/backend/pkdb_app/comments/models.py @@ -59,9 +59,6 @@ class Comment(models.Model): InterventionSet, related_name="comments", null=True, on_delete=models.CASCADE ) - reference = models.ForeignKey( - Reference, related_name="comments", null=True, on_delete=models.CASCADE - ) study = models.ForeignKey( Study, related_name="comments", null=True, on_delete=models.CASCADE ) @@ -70,11 +67,8 @@ class Meta: ordering = ['pk'] - - class Description(models.Model): text = models.TextField(blank=True, null=True) - groupset = models.ForeignKey( GroupSet, related_name="descriptions", null=True, on_delete=models.CASCADE ) @@ -94,6 +88,30 @@ class Description(models.Model): Study, related_name="descriptions", null=True, on_delete=models.CASCADE ) + individual_ex = models.ForeignKey( + IndividualEx, related_name="descriptions", null=True, on_delete=models.CASCADE + ) + + group_ex = models.ForeignKey( + GroupEx, related_name="descriptions", null=True, on_delete=models.CASCADE + ) + + characteristica_ex = models.ForeignKey( + CharacteristicaEx, related_name="descriptions", null=True, on_delete=models.CASCADE + ) + + output_ex = models.ForeignKey( + OutputEx, related_name="descriptions", null=True, on_delete=models.CASCADE + ) + + timecourse_ex = models.ForeignKey( + TimecourseEx, related_name="descriptions", null=True, on_delete=models.CASCADE + ) + + intervention_ex = models.ForeignKey( + InterventionEx, related_name="descriptions", null=True, on_delete=models.CASCADE + ) + class Meta: ordering = ['pk'] diff --git a/backend/pkdb_app/interventions/managers.py b/backend/pkdb_app/interventions/managers.py index 8ca48ec1..82323fb7 100644 --- a/backend/pkdb_app/interventions/managers.py +++ b/backend/pkdb_app/interventions/managers.py @@ -30,9 +30,11 @@ def create(self, *args, **kwargs): interventions = kwargs.pop('interventions', []) comments = kwargs.pop('comments', []) + descriptions = kwargs.pop('descriptions', []) intervention_ex = super().create(*args, **kwargs) + create_multiple(intervention_ex, descriptions, 'descriptions') create_multiple(intervention_ex, comments, 'comments') Intervention = apps.get_model('interventions', 'Intervention') not_norm_interventions = create_multiple_bulk(intervention_ex, "ex", interventions, Intervention) diff --git a/backend/pkdb_app/interventions/serializers.py b/backend/pkdb_app/interventions/serializers.py index f5daadac..f1b59863 100644 --- a/backend/pkdb_app/interventions/serializers.py +++ b/backend/pkdb_app/interventions/serializers.py @@ -4,14 +4,13 @@ import itertools from pkdb_app import utils -from pkdb_app.categorials.behaviours import VALUE_FIELDS, VALUE_FIELDS_NO_UNIT, \ +from pkdb_app.categorials.behaviours import VALUE_FIELDS_NO_UNIT, \ MEASUREMENTTYPE_FIELDS, map_field, EX_MEASUREMENTTYPE_FIELDS from pkdb_app.categorials.models import Tissue, Route, Application, Form from pkdb_app.categorials.serializers import MeasurementTypeableSerializer, EXMeasurementTypeableSerializer from pkdb_app.subjects.serializers import EXTERN_FILE_FIELDS from rest_framework import serializers -from pkdb_app.users.serializers import UserElasticSerializer from ..comments.serializers import DescriptionSerializer, CommentSerializer, DescriptionElasticSerializer, \ CommentElasticSerializer @@ -85,6 +84,8 @@ class Meta: def to_internal_value(self, data): data.pop("comments", None) + data.pop("descriptions", None) + data = self.retransform_map_fields(data) data = self.retransform_ex_fields(data) self.validate_wrong_keys(data) @@ -134,7 +135,9 @@ class InterventionExSerializer(EXMeasurementTypeableSerializer): comments = CommentSerializer( many=True, read_only=False, required=False, allow_null=True ) - + descriptions = DescriptionSerializer( + many=True, read_only=False, required=False, allow_null=True + ) # internal data interventions = InterventionSerializer( many=True, write_only=True, required=False, allow_null=True @@ -147,7 +150,7 @@ class Meta: + INTERVENTION_FIELDS + INTERVENTION_MAP_FIELDS + EX_MEASUREMENTTYPE_FIELDS - + ["interventions", "comments"] + + ["interventions", "comments","descriptions"] ) def to_internal_value(self, data): diff --git a/backend/pkdb_app/outputs/managers.py b/backend/pkdb_app/outputs/managers.py index e85c885c..45be6c5b 100644 --- a/backend/pkdb_app/outputs/managers.py +++ b/backend/pkdb_app/outputs/managers.py @@ -49,11 +49,15 @@ def create(self, *args, **kwargs): outputs = kwargs.pop('outputs', []) interventions = kwargs.pop('interventions', []) comments = kwargs.pop('comments', []) + descriptions = kwargs.pop('descriptions', []) + output_ex = super().create(*args, **kwargs) output_ex.interventions.add(*interventions) create_multiple(output_ex, comments, 'comments') + create_multiple(output_ex, descriptions, 'descriptions') + outputs_dj = create_multiple(output_ex, outputs, 'outputs') Output = apps.get_model('outputs', 'Output') @@ -78,10 +82,13 @@ def create(self, *args, **kwargs): timecourses = kwargs.pop('timecourses', []) interventions = kwargs.pop('interventions', []) comments = kwargs.pop('comments', []) + descriptions = kwargs.pop('descriptions', []) + timecourse_ex = super().create(*args, **kwargs) timecourse_ex.interventions.add(*interventions) create_multiple(timecourse_ex, comments, 'comments') + create_multiple(timecourse_ex, descriptions, 'descriptions') timecourses_dj = create_multiple(timecourse_ex, timecourses, 'timecourses') Timecourse = type(timecourses_dj[0]) diff --git a/backend/pkdb_app/outputs/serializers.py b/backend/pkdb_app/outputs/serializers.py index 4cffc727..6661502d 100644 --- a/backend/pkdb_app/outputs/serializers.py +++ b/backend/pkdb_app/outputs/serializers.py @@ -82,6 +82,8 @@ class Meta: def to_internal_value(self, data): data.pop("comments", None) + data.pop("descriptions", None) + data = self.retransform_map_fields(data) data = self.to_internal_related_fields(data) self.validate_wrong_keys(data) @@ -159,6 +161,9 @@ class OutputExSerializer(BaseOutputExSerializer): comments = CommentSerializer( many=True, read_only=False, required=False, allow_null=True ) + descriptions = DescriptionSerializer( + many=True, read_only=False, required=False, allow_null=True + ) # internal data outputs = OutputSerializer( @@ -179,6 +184,8 @@ class Meta: "interventions_map", "outputs", "comments", + "descriptions" + ] ) @@ -256,6 +263,7 @@ class Meta: def to_internal_value(self, data): data.pop("comments", None) + data.pop("descriptions",None) data = self.to_internal_related_fields(data) self.validate_wrong_keys(data) return super(serializers.ModelSerializer, self).to_internal_value(data) @@ -316,6 +324,9 @@ class TimecourseExSerializer(BaseOutputExSerializer): comments = CommentSerializer( many=True, read_only=False, required=False, allow_null=True ) + descriptions = DescriptionSerializer( + many=True, read_only=False, required=False, allow_null=True + ) # internal data timecourses = TimecourseSerializer( @@ -331,7 +342,7 @@ class Meta: + EX_MEASUREMENTTYPE_FIELDS + ["group", "individual", "interventions"] + ["group_map", "individual_map", "interventions_map"] - + ["timecourses", "comments"] + + ["timecourses", "comments","descriptions"] ) def to_internal_value(self, data): diff --git a/backend/pkdb_app/subjects/managers.py b/backend/pkdb_app/subjects/managers.py index cde4ec8c..3a97f834 100644 --- a/backend/pkdb_app/subjects/managers.py +++ b/backend/pkdb_app/subjects/managers.py @@ -51,6 +51,7 @@ def create(self, *args, **kwargs): study = kwargs.pop("study") group_exs = kwargs.pop("group_exs") comments = kwargs.pop("comments", []) + descriptions = kwargs.pop("descriptions", []) group_ex = super().create(*args, **kwargs) for characteristica_ex_single in characteristica_ex: @@ -65,6 +66,7 @@ def create(self, *args, **kwargs): group_ex.groups.create(**group) create_multiple(group_ex, comments, "comments") + create_multiple(group_ex, descriptions, "descriptions") group_ex.save() return group_ex @@ -103,9 +105,13 @@ def create(self, *args, **kwargs): class CharacteristicaExManager(models.Manager): def create(self, *args, **kwargs): comments = kwargs.pop("comments", []) + descriptions = kwargs.pop("descriptions", []) + instance = super().create(*args, **kwargs) create_multiple(instance, comments, "comments") + create_multiple(instance, descriptions, "descriptions") + instance.save() return instance @@ -144,16 +150,20 @@ def create(self, *args, **kwargs): characteristica_ex = kwargs.pop("characteristica_ex", []) individuals = kwargs.pop("individuals", []) comments = kwargs.pop("comments", []) + descriptions = kwargs.pop("descriptions", []) - Comment = apps.get_model('comments','Comment') + comment_model = apps.get_model('comments','Comment') + description_model = apps.get_model('comments','Description') individual_ex = super().create(*args, **kwargs) create_multiple(individual_ex, characteristica_ex, "characteristica_ex") create_multiple(individual_ex, individuals, "individuals") + #create_multiple(individual_ex, comments, "comments") + create_multiple_bulk(individual_ex,"ex", comments, comment_model) + create_multiple_bulk(individual_ex,"ex", descriptions, description_model) - create_multiple_bulk(individual_ex,"ex", comments, Comment) individual_ex.save() return individual_ex diff --git a/backend/pkdb_app/subjects/serializers.py b/backend/pkdb_app/subjects/serializers.py index ac04c3dd..b673ad85 100644 --- a/backend/pkdb_app/subjects/serializers.py +++ b/backend/pkdb_app/subjects/serializers.py @@ -60,6 +60,9 @@ class CharacteristicaExSerializer(EXMeasurementTypeableSerializer): comments = CommentSerializer( many=True, read_only=False, required=False, allow_null=True ) + descriptions = DescriptionSerializer( + many=True, read_only=False, required=False, allow_null=True + ) class Meta: @@ -68,7 +71,7 @@ class Meta: CHARACTERISTISTA_FIELDS + CHARACTERISTISTA_MAP_FIELDS + EX_MEASUREMENTTYPE_FIELDS - + ["comments"] + + ["comments","descriptions"] ) @@ -92,6 +95,7 @@ class Meta: def to_internal_value(self, data): data.pop("comments", None) + data.pop("descriptions", None) self._is_required(data,"measurement_type") self.validate_wrong_keys(data) return super(serializers.ModelSerializer,self).to_internal_value(data) @@ -121,6 +125,7 @@ class Meta: def to_internal_value(self, data): data.pop("comments", None) + data.pop("descriptions", None) data = self.retransform_map_fields(data) data = self.retransform_ex_fields(data) self.validate_wrong_keys(data) @@ -165,7 +170,9 @@ class GroupExSerializer(ExSerializer): comments = CommentSerializer( many=True, read_only=False, required=False, allow_null=True ) - + descriptions = DescriptionSerializer( + many=True, read_only=False, required=False, allow_null=True + ) # internal data groups = GroupSerializer( many=True, write_only=True, required=False, allow_null=True @@ -177,7 +184,7 @@ class Meta: EXTERN_FILE_FIELDS + GROUP_FIELDS + GROUP_MAP_FIELDS - + ["parent_ex", "characteristica_ex", "groups", "comments"] + + ["parent_ex", "characteristica_ex", "groups", "comments", "descriptions"] ) def to_internal_value(self, data): @@ -275,6 +282,7 @@ def group_to_internal_value(group, study_sid): def to_internal_value(self, data): self._is_required(data,"group") data.pop("comments", None) + data.pop("descriptions", None) study_sid = self.context["request"].path.split("/")[-2] if "group" in data: data["group"] = self.group_to_internal_value(data["group"], study_sid) @@ -312,6 +320,9 @@ class IndividualExSerializer(ExSerializer): comments = CommentSerializer( many=True, read_only=False, required=False, allow_null=True ) + descriptions = DescriptionSerializer( + many=True, read_only=False, required=False, allow_null=True + ) # internal data individuals = IndividualSerializer( @@ -328,6 +339,7 @@ class Meta: "characteristica_ex", "individuals", "comments", + "descriptions" ] @staticmethod From 884fd7fdcad8bda1db3e9840b8f757f973c9dd5b Mon Sep 17 00:00:00 2001 From: Jan Grzegorzewski Date: Wed, 30 Oct 2019 12:49:35 +0100 Subject: [PATCH 16/19] clean up code --- backend/pkdb_app/__init__.py | 2 +- backend/pkdb_app/analysis/pharmacokinetic.py | 65 +- .../analysis/pharmacokinetic_example.py | 4 - backend/pkdb_app/behaviours.py | 6 +- backend/pkdb_app/categorials/apps.py | 1 - backend/pkdb_app/categorials/behaviours.py | 52 +- backend/pkdb_app/categorials/documents.py | 4 +- backend/pkdb_app/categorials/managers.py | 2 +- backend/pkdb_app/categorials/models.py | 56 +- backend/pkdb_app/categorials/serializers.py | 47 +- backend/pkdb_app/categorials/views.py | 6 +- backend/pkdb_app/comments/admin.py | 2 - backend/pkdb_app/comments/apps.py | 1 - backend/pkdb_app/comments/documents.py | 2 +- backend/pkdb_app/comments/models.py | 2 - backend/pkdb_app/comments/serializers.py | 6 +- backend/pkdb_app/comments/views.py | 13 +- backend/pkdb_app/documents.py | 12 +- backend/pkdb_app/interventions/documents.py | 1 + backend/pkdb_app/interventions/managers.py | 2 - backend/pkdb_app/interventions/models.py | 1 + backend/pkdb_app/interventions/serializers.py | 81 +- backend/pkdb_app/interventions/views.py | 35 +- backend/pkdb_app/logging_utils.py | 3 +- backend/pkdb_app/normalization.py | 5 - backend/pkdb_app/outputs/documents.py | 15 +- backend/pkdb_app/outputs/managers.py | 26 +- backend/pkdb_app/outputs/models.py | 40 +- backend/pkdb_app/outputs/serializers.py | 147 +- backend/pkdb_app/outputs/views.py | 131 +- backend/pkdb_app/serializers.py | 18 +- backend/pkdb_app/settings.py | 32 +- backend/pkdb_app/static/css/main.css | 133 +- backend/pkdb_app/statistics.py | 4 +- backend/pkdb_app/storage.py | 2 - backend/pkdb_app/studies/admin.py | 2 +- backend/pkdb_app/studies/models.py | 2 - backend/pkdb_app/studies/serializers.py | 101 +- backend/pkdb_app/studies/views.py | 33 +- backend/pkdb_app/subjects/documents.py | 55 +- backend/pkdb_app/subjects/managers.py | 41 +- backend/pkdb_app/subjects/models.py | 50 +- backend/pkdb_app/subjects/serializers.py | 97 +- backend/pkdb_app/subjects/views.py | 76 +- backend/pkdb_app/substances/apps.py | 1 - backend/pkdb_app/substances/documents.py | 1 + backend/pkdb_app/substances/managers.py | 4 +- backend/pkdb_app/substances/serializers.py | 27 +- backend/pkdb_app/substances/views.py | 15 +- .../templates/allauth/account/base.html | 34 +- .../templates/allauth/account/email.html | 130 +- .../allauth/account/email_confirm.html | 27 +- .../templates/allauth/account/login.html | 52 +- .../templates/allauth/account/logout.html | 18 +- .../allauth/account/password_change.html | 2 +- .../allauth/account/password_reset.html | 12 +- .../account/password_reset_from_key.html | 35 +- .../allauth/account/password_set.html | 14 +- .../templates/allauth/account/signup.html | 25 +- .../allauth/socialaccount/connections.html | 136 +- .../allauth/socialaccount/signup.html | 29 +- backend/pkdb_app/templates/base.html | 22 +- backend/pkdb_app/tests/test_api.py | 13 +- backend/pkdb_app/tests/test_serializer.py | 85 +- .../pkdb_app/tests/test_study/reference.json | 68 +- backend/pkdb_app/tests/test_study/study.json | 12 +- backend/pkdb_app/urls.py | 12 +- .../management/commands/createsuperuser2.py | 6 +- backend/pkdb_app/users/models.py | 2 +- backend/pkdb_app/users/permissions.py | 54 +- backend/pkdb_app/users/serializers.py | 17 +- backend/pkdb_app/users/views.py | 4 +- backend/pkdb_app/utils.py | 50 +- backend/pkdb_app/views.py | 18 +- backend/setup.py | 2 +- docker-compose-develop.yml | 6 +- docker-compose-production.yml | 6 +- frontend/.eslintrc.js | 30 +- frontend/babel.config.js | 14 +- frontend/postcss.config.js | 6 +- frontend/public/index.html | 22 +- frontend/src/assets/vuetify.css | 12744 +++++++++------- frontend/src/components/tables/mixins.js | 85 +- frontend/src/icons.js | 24 +- frontend/src/main.js | 73 +- frontend/src/router.js | 254 +- frontend/src/store.js | 16 +- frontend/src/utils.js | 20 +- frontend/tests/unit/.eslintrc.js | 6 +- frontend/tests/unit/example.spec.js | 16 +- 90 files changed, 8867 insertions(+), 6798 deletions(-) diff --git a/backend/pkdb_app/__init__.py b/backend/pkdb_app/__init__.py index 7df9f7aa..8dee4bf8 100644 --- a/backend/pkdb_app/__init__.py +++ b/backend/pkdb_app/__init__.py @@ -1 +1 @@ -from ._version import __version__ \ No newline at end of file +from ._version import __version__ diff --git a/backend/pkdb_app/analysis/pharmacokinetic.py b/backend/pkdb_app/analysis/pharmacokinetic.py index af15f233..e9d21702 100644 --- a/backend/pkdb_app/analysis/pharmacokinetic.py +++ b/backend/pkdb_app/analysis/pharmacokinetic.py @@ -11,22 +11,23 @@ import warnings import functools + # TODO: add estimation of confidence intervals (use also the errorbars on the curves) # Currently only simple calculation of pharmacokinetic parameters def f_pk( - t, - c, - compound, - dose=np.nan, - bodyweight=np.nan, - t_unit="h", - c_unit="mg/L", - dose_unit="mg", - vd_unit="L", - bodyweight_unit="kg", - intervention_time = 0, + t, + c, + compound, + dose=np.nan, + bodyweight=np.nan, + t_unit="h", + c_unit="mg/L", + dose_unit="mg", + vd_unit="L", + bodyweight_unit="kg", + intervention_time=0, ): """ Calculates all the pk parameters from given time course. @@ -151,9 +152,8 @@ def pk_report(pk): ]: pk_key = pd.to_numeric(pk[key]) lines.append( - "\t{:<12}: {:>3.3f} [{}]".format(key, pk_key, pk["{}_unit".format(key)]) - ) - + "\t{:<12}: {:>3.3f} [{}]".format(key, pk_key, pk["{}_unit".format(key)]) + ) lines.append("") for key in ["dose", "auc", "aucinf", "kel", "vd", "cl"]: @@ -199,8 +199,8 @@ def pk_figure(t, c, pk): ax1.plot(t[: max_idx + 1], c[: max_idx + 1], "o", color="darkgray", **kwargs) if max_idx < c.size - 1: ax1.plot( - t[max_idx + 1 :], - c[max_idx + 1 :], + t[max_idx + 1:], + c[max_idx + 1:], "s", color="black", linewidth=2, @@ -217,8 +217,8 @@ def pk_figure(t, c, pk): ax2.plot(t[1:], np.log(c[1:]), "--", color="black", label="__nolabel__", **kwargs) ax2.plot( - t[1 : max_idx + 1], - np.log(c[1 : max_idx + 1]), + t[1: max_idx + 1], + np.log(c[1: max_idx + 1]), "o", color="darkgray", label="log(substance)", @@ -226,8 +226,8 @@ def pk_figure(t, c, pk): ) if max_idx < c.size - 1: ax2.plot( - t[max_idx + 1 :], - np.log(c[max_idx + 1 :]), + t[max_idx + 1:], + np.log(c[max_idx + 1:]), "s", color="black", linewidth=2, @@ -255,9 +255,9 @@ def _aucinf(t, c, slope=None, intercept=None): [slope, intercept, r_value, p_value, std_err, max_index] = _regression(t, c) auc = _auc(t, c) - #auc_d = -(np.exp(intercept) / slope) * np.exp(slope * t[-1]) - #should be equivalent to the result above - auc_d = c[-1]/(-slope) + # auc_d = -(np.exp(intercept) / slope) * np.exp(slope * t[-1]) + # should be equivalent to the result above + auc_d = c[-1] / (-slope) return auc + auc_d @@ -317,23 +317,22 @@ def _kel(t, c, slope=None): line (on a logarithmic y scale). """ if slope is None: - [slope, intercept, r_value, p_value, std_err,max_index] = _regression(t, c) + [slope, intercept, r_value, p_value, std_err, max_index] = _regression(t, c) return -slope -def _kel_cv(t, c, std_err=None,slope=None): +def _kel_cv(t, c, std_err=None, slope=None): if std_err is None or slope is None: - [slope, intercept, r_value, p_value, std_err,max_index] = _regression(t, c) - return std_err/slope + [slope, intercept, r_value, p_value, std_err, max_index] = _regression(t, c) + return std_err / slope -def _thalf_cv(t, c, slope=None, std_err=None ): +def _thalf_cv(t, c, slope=None, std_err=None): kel = _kel(t, c, slope=slope) return np.log(2) / _kel_cv(t, c, slope=slope, std_err=std_err) - def _thalf(t, c, slope=None): """ Calculates the half-life using the elimination constant. @@ -350,6 +349,7 @@ def _thalf(t, c, slope=None): kel = _kel(t, c, slope=slope) return np.log(2) / kel + def _vd(t, c, dose, intercept=None): """ Apparent volume of distribution. @@ -374,9 +374,10 @@ def _vd(t, c, dose, intercept=None): determined from Vd; only that it goes somewhere. """ if intercept is None: - [slope, intercept, r_value, p_value, std_err,max_index] = _regression(t, c) + [slope, intercept, r_value, p_value, std_err, max_index] = _regression(t, c) return dose / np.exp(intercept) + def _regression(t, c): """ Linear regression on the log timecourse after maximal value. No check is performed if already in equilibrium distribution !. @@ -391,8 +392,8 @@ def _regression(t, c): return [np.nan] * 6 # linear regression start regression on datapoint after maximum - x = t[max_index+1:] - y = np.log(c[max_index+1:]) + x = t[max_index + 1:] + y = np.log(c[max_index + 1:]) # x = t[-4:] # y = np.log(c[-4:]) diff --git a/backend/pkdb_app/analysis/pharmacokinetic_example.py b/backend/pkdb_app/analysis/pharmacokinetic_example.py index 1c9877bb..9f2fd470 100644 --- a/backend/pkdb_app/analysis/pharmacokinetic_example.py +++ b/backend/pkdb_app/analysis/pharmacokinetic_example.py @@ -31,8 +31,6 @@ def example1(): t = data.time c = data.caf - - pk = pharmacokinetic.f_pk( t=t, c=c, @@ -85,8 +83,6 @@ def example2(): elif substance == "paraxanthine": c = data.px - - pk = pharmacokinetic.f_pk( t=t, c=c, diff --git a/backend/pkdb_app/behaviours.py b/backend/pkdb_app/behaviours.py index a43a61cc..d158f9b8 100644 --- a/backend/pkdb_app/behaviours.py +++ b/backend/pkdb_app/behaviours.py @@ -6,7 +6,6 @@ from .utils import CHAR_MAX_LENGTH_LONG, CHAR_MAX_LENGTH - class Sidable(models.Model): """ Model has an sid. """ sid = models.CharField(max_length=CHAR_MAX_LENGTH, primary_key=True) @@ -14,8 +13,9 @@ class Sidable(models.Model): class Meta: abstract = True + class Externable(models.Model): - #format = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) + # format = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) subset_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) groupby = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) source_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) @@ -48,5 +48,3 @@ def study_name(self): @property def study_sid(self): return self.study.sid - - diff --git a/backend/pkdb_app/categorials/apps.py b/backend/pkdb_app/categorials/apps.py index 6ef87142..45aa9491 100644 --- a/backend/pkdb_app/categorials/apps.py +++ b/backend/pkdb_app/categorials/apps.py @@ -3,4 +3,3 @@ class CategorialsConfig(AppConfig): name = "categorials" - diff --git a/backend/pkdb_app/categorials/behaviours.py b/backend/pkdb_app/categorials/behaviours.py index 09feaa76..57eb71f0 100644 --- a/backend/pkdb_app/categorials/behaviours.py +++ b/backend/pkdb_app/categorials/behaviours.py @@ -3,18 +3,17 @@ from django.db import models from pkdb_app.utils import CHAR_MAX_LENGTH_LONG, CHAR_MAX_LENGTH + def map_field(fields): - return [f"{field}_map" for field in fields] + return [f"{field}_map" for field in fields] + VALUE_FIELDS_NO_UNIT = ["value", "mean", "median", "min", "max", "sd", "se", "cv"] -VALUE_FIELDS = VALUE_FIELDS_NO_UNIT + ["unit"] +VALUE_FIELDS = VALUE_FIELDS_NO_UNIT + ["unit"] VALUE_MAP_FIELDS = map_field(VALUE_FIELDS) - -MEASUREMENTTYPE_FIELDS = ["measurement_type", "choice","substance"] +VALUE_FIELDS -EX_MEASUREMENTTYPE_FIELDS =MEASUREMENTTYPE_FIELDS + map_field(MEASUREMENTTYPE_FIELDS) - - +MEASUREMENTTYPE_FIELDS = ["measurement_type", "choice", "substance"] + VALUE_FIELDS +EX_MEASUREMENTTYPE_FIELDS = MEASUREMENTTYPE_FIELDS + map_field(MEASUREMENTTYPE_FIELDS) class ValueableMapNotBlank(models.Model): @@ -29,7 +28,6 @@ class ValueableMapNotBlank(models.Model): cv_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) unit_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) - class Meta: abstract = True @@ -39,38 +37,35 @@ class ValueableNotBlank(models.Model): Adds fields to store values with their statistics. """ - value = models.FloatField(null=True) - mean = models.FloatField(null=True) - median = models.FloatField(null=True) - min = models.FloatField(null=True) - max = models.FloatField(null=True) - sd = models.FloatField(null=True) - se = models.FloatField(null=True) - cv = models.FloatField(null=True) - unit = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) + value = models.FloatField(null=True) + mean = models.FloatField(null=True) + median = models.FloatField(null=True) + min = models.FloatField(null=True) + max = models.FloatField(null=True) + sd = models.FloatField(null=True) + se = models.FloatField(null=True) + cv = models.FloatField(null=True) + unit = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) class Meta: abstract = True -class ExMeasurementTypeable(ValueableNotBlank,ValueableMapNotBlank): +class ExMeasurementTypeable(ValueableNotBlank, ValueableMapNotBlank): measurement_type = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) measurement_type_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) choice = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) choice_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) - #substance = models.ForeignKey(Substance, null=True, on_delete=models.PROTECT) + # substance = models.ForeignKey(Substance, null=True, on_delete=models.PROTECT) substance = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) substance_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) - class Meta: abstract = True - class MeasurementTypeable(ValueableNotBlank): - measurement_type = models.ForeignKey(MeasurementType, on_delete=models.CASCADE) substance = models.ForeignKey(Substance, null=True, on_delete=models.PROTECT) choice = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) @@ -95,8 +90,6 @@ def choices(self): return self.measurement_type.choices_list() - - class Normalizable(MeasurementTypeable): raw = models.ForeignKey("self", related_name="norm", on_delete=models.CASCADE, null=True) normed = models.BooleanField(default=False) @@ -104,7 +97,6 @@ class Normalizable(MeasurementTypeable): class Meta: abstract = True - @property def norm_fields(self): return {"value": self.value, "mean": self.mean, "median": self.median, "min": self.min, "max": self.max, @@ -144,15 +136,13 @@ def remove_substance_dimension(self): """ is_removeable_substance, dimension = self.is_removeable_substance_dimension if is_removeable_substance: - molar_weight = ureg("g/mol")*self.substance.mass + molar_weight = ureg("g/mol") * self.substance.mass p_unit = self.measurement_type.p_unit(self.unit) - this_quantity = p_unit*molar_weight**dimension + this_quantity = p_unit * molar_weight ** dimension return (this_quantity.magnitude, str(this_quantity.units)) else: return (1, self.unit) - - def normalize(self): """ Normalizes the units. @@ -171,10 +161,10 @@ def normalize(self): if ureg(unit) != ureg(self.unit): for key, value in self.norm_fields.items(): if value is not None: - setattr(self, key, value*factor) + setattr(self, key, value * factor) self.unit = unit - #else: + # else: # self.unit = str(ureg(self.unit).u) # normalization diff --git a/backend/pkdb_app/categorials/documents.py b/backend/pkdb_app/categorials/documents.py index 1ae20a91..f1405a14 100644 --- a/backend/pkdb_app/categorials/documents.py +++ b/backend/pkdb_app/categorials/documents.py @@ -16,7 +16,7 @@ class MeasurementTypeDocument(Document): units = interventions = ObjectField(properties={ 'name': string_field('name') - }, multi=True) + }, multi=True) choices = ObjectField( attr="choices", @@ -34,7 +34,7 @@ class MeasurementTypeDocument(Document): "description": string_field("description"), "label": string_field("label") } - ) + ) } ) annotations = ObjectField( diff --git a/backend/pkdb_app/categorials/managers.py b/backend/pkdb_app/categorials/managers.py index e21d8681..4d0ef146 100644 --- a/backend/pkdb_app/categorials/managers.py +++ b/backend/pkdb_app/categorials/managers.py @@ -6,6 +6,6 @@ class ChoiceManager(models.Manager): def create(self, *args, **kwargs): annotations = kwargs.pop('annotations', []) choice = super().create(*args, **kwargs) - update_or_create_multiple(choice, annotations, 'annotations', lookup_fields=["term","relation"]) + update_or_create_multiple(choice, annotations, 'annotations', lookup_fields=["term", "relation"]) choice.save() return choice diff --git a/backend/pkdb_app/categorials/models.py b/backend/pkdb_app/categorials/models.py index f48da72b..07ac4611 100644 --- a/backend/pkdb_app/categorials/models.py +++ b/backend/pkdb_app/categorials/models.py @@ -28,12 +28,11 @@ NO_UNIT = 'NO_UNIT' - NUMERIC_TYPE = "numeric" CATEGORIAL_TYPE = "categorial" BOOLEAN_TYPE = "boolean" NUMERIC_CATEGORIAL_TYPE = "numeric_categorial" -DTYPE_CHOICES = create_choices([NUMERIC_TYPE,CATEGORIAL_TYPE, BOOLEAN_TYPE,NUMERIC_CATEGORIAL_TYPE]) +DTYPE_CHOICES = create_choices([NUMERIC_TYPE, CATEGORIAL_TYPE, BOOLEAN_TYPE, NUMERIC_CATEGORIAL_TYPE]) CAN_NEGATIVE_MEASUREMENT_TYPE = [] @@ -60,7 +59,7 @@ def p_unit(self): class Annotation(models.Model): term = models.CharField(max_length=CHAR_MAX_LENGTH) - relation = models.CharField(max_length=CHAR_MAX_LENGTH,) + relation = models.CharField(max_length=CHAR_MAX_LENGTH, ) collection = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) description = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) label = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) @@ -118,7 +117,6 @@ def __str__(self): def __repr__(self): return self.name - @property def n_p_units(self): """ @@ -154,15 +152,14 @@ def p_unit(self, unit): raise ValueError(f"unit [{unit}] is not defined in unit registry or not allowed.") - def is_valid_unit(self, unit): if len(self.n_units) != 0: if unit: return any([self.p_unit(unit).check(dim) for dim in self.valid_dimensions]) else: - #unit_not_required2 = self.dtype == NUMERIC_CATEGORIAL_TYPE - #return unit_not_required2 + # unit_not_required2 = self.dtype == NUMERIC_CATEGORIAL_TYPE + # return unit_not_required2 unit_not_required2 = NO_UNIT in self.n_units return unit_not_required2 @@ -208,31 +205,30 @@ def normalize(self, magnitude, unit): return result def is_valid_choice(self, choice): - return choice in self.choices.values_list("name",flat=True) + return choice in self.choices.values_list("name", flat=True) def choices_list(self): return self.choices.values_list("name", flat=True) def annotations_strings(self): - return [f"relation <{annotation.relation}>:, {annotation.term}"for annotation in self.annotations.all()] + return [f"relation <{annotation.relation}>:, {annotation.term}" for annotation in self.annotations.all()] def _asdict(self): return { - "name":self.name, - "description":self.description, - "annotations":self.annotations_strings(), - "url_slug":self.url_slug, - "dtype":self.dtype, + "name": self.name, + "description": self.description, + "annotations": self.annotations_strings(), + "url_slug": self.url_slug, + "dtype": self.dtype, "choices": self.choices_list(), "units": self.n_units, "valid unit dimensions": self.valid_dimensions, "creator": self.creator.username, } - def validate_choice(self, choice): if choice: - if self.dtype in [CATEGORIAL_TYPE,BOOLEAN_TYPE, NUMERIC_CATEGORIAL_TYPE]: + if self.dtype in [CATEGORIAL_TYPE, BOOLEAN_TYPE, NUMERIC_CATEGORIAL_TYPE]: if not self.is_valid_choice(choice): msg = f"The choice `{choice}` is not a valid choice for measurement type `{self.name}`. " \ f"Allowed choices are: `{list(self.choices_list())}`." @@ -244,11 +240,12 @@ def validate_choice(self, choice): raise ValueError({"choice": msg}) elif self.choices.exists(): msg = f"{choice}. A choice is required for `{self.name}`. Allowed choices are: `{list(self.choices_list())}`." - raise ValueError({"choice":msg}) + raise ValueError({"choice": msg}) @property def numeric_fields(self): - return ["value", "mean", "median", "min", "max","sd", "se", "cv"] + return ["value", "mean", "median", "min", "max", "sd", "se", "cv"] + @property def can_be_negative(self): return self.name in CAN_NEGATIVE_MEASUREMENT_TYPE @@ -261,25 +258,24 @@ def validate_numeric(self, data): if isinstance(value, Number): rule = value < 0 - #for timecourses + # for timecourses - elif isinstance(value,list): + elif isinstance(value, list): rule = any(v < 0 for v in value) else: rule = False if rule: - raise ValueError( - {field: f"Numeric values need to be positive (>=0) " - f"for all measurement types except " - f"<{CAN_NEGATIVE_MEASUREMENT_TYPE}>.", "detail":data}) + raise ValueError( + {field: f"Numeric values need to be positive (>=0) " + f"for all measurement types except " + f"<{CAN_NEGATIVE_MEASUREMENT_TYPE}>.", "detail": data}) def validate_complete(self, data): # check unit - - self.validate_unit(data.get("unit",None)) + self.validate_unit(data.get("unit", None)) self.validate_numeric(data) choice = data.get("choice", None) @@ -289,12 +285,11 @@ def validate_complete(self, data): if time_unit: self.validate_time_unit(time_unit) - time_required_measurement_types = ["cumulative amount","cumulative metabolic ratio","recovery","auc_end"] + time_required_measurement_types = ["cumulative amount", "cumulative metabolic ratio", "recovery", "auc_end"] if self.name in time_required_measurement_types: details = f"for measurement type `{self.name}`" - _validate_requried_key(data,"time", details=details) - _validate_requried_key(data,"time_unit", details=details) - + _validate_requried_key(data, "time", details=details) + _validate_requried_key(data, "time_unit", details=details) @property def creator_username(self): @@ -302,4 +297,3 @@ def creator_username(self): :return: list of normalized units in the data format of pint """ return self.creator.username - diff --git a/backend/pkdb_app/categorials/serializers.py b/backend/pkdb_app/categorials/serializers.py index 8e55fb41..a167998e 100644 --- a/backend/pkdb_app/categorials/serializers.py +++ b/backend/pkdb_app/categorials/serializers.py @@ -18,7 +18,6 @@ class EXMeasurementTypeableSerializer(ExSerializer): measurement_type_map = serializers.CharField(allow_blank=False) - class MeasurementTypeableSerializer(EXMeasurementTypeableSerializer): substance = utils.SlugRelatedField( slug_field="name", @@ -61,25 +60,26 @@ def to_internal_value(self, data): class TissueSerializer(BaseCategorySerializer): class Meta: model = Tissue - fields = ["name","creator","url_slug", "description"] + fields = ["name", "creator", "url_slug", "description"] class FormSerializer(BaseCategorySerializer): class Meta: model = Form - fields = ["name","creator","url_slug", "description"] + fields = ["name", "creator", "url_slug", "description"] class ApplicationSerializer(BaseCategorySerializer): class Meta: model = Application - fields = ["name","creator","url_slug", "description"] + fields = ["name", "creator", "url_slug", "description"] class RouteSerializer(BaseCategorySerializer): class Meta: model = Route - fields = ["name","creator","url_slug", "description"] + fields = ["name", "creator", "url_slug", "description"] + class AnnotationSerializer(serializers.ModelSerializer): term = serializers.CharField() @@ -88,33 +88,31 @@ class AnnotationSerializer(serializers.ModelSerializer): class Meta: model = Annotation - fields = ["term","relation","collection","description","label"] + fields = ["term", "relation", "collection", "description", "label"] + class ChoiceSerializer(serializers.ModelSerializer): annotations = AnnotationSerializer(many=True, allow_null=True) + class Meta: model = Choice - fields = ["name", "annotations","description"] - - + fields = ["name", "annotations", "description"] class BaseSerializer(WrongKeyValidationSerializer): - def pop_related(self,data): - related_instances = ["units","choices","annotations"] - return {related:data.pop(related,[]) for related in related_instances} + def pop_related(self, data): + related_instances = ["units", "choices", "annotations"] + return {related: data.pop(related, []) for related in related_instances} + def update_or_create_related(self, instance, related_dict): + lookup_fields = {"units": ["name"], "choices": ["name"], "annotations": ["term", "relation"]} - def update_or_create_related(self,instance, related_dict): - lookup_fields = {"units":["name"],"choices":["name"],"annotations":["term","relation"]} - - for related,related_data in related_dict.items(): + for related, related_data in related_dict.items(): if hasattr(instance, related): - related_instance = getattr(instance,related) + related_instance = getattr(instance, related) related_instance.clear() - update_or_create_multiple(instance, related_data, related, lookup_fields=lookup_fields[related]) def to_representation(self, instance): @@ -126,15 +124,14 @@ def to_internal_value(self, data): self.validate_wrong_keys(data) data["creator"] = self.context['request'].user.id for field in ["units"]: - data[field] = [{"name":value} for value in data.get(field,[])] - + data[field] = [{"name": value} for value in data.get(field, [])] return super().to_internal_value(data) def create(self, validated_data): related_dict = self.pop_related(validated_data) instance = self.Meta.model.objects.create(**validated_data) - self.update_or_create_related(instance,related_dict) + self.update_or_create_related(instance, related_dict) instance.save() return instance @@ -143,7 +140,7 @@ def update(self, instance, validated_data): related_dict = self.pop_related(validated_data) for name, value in validated_data.items(): setattr(instance, name, value) - self.update_or_create_related(instance,related_dict) + self.update_or_create_related(instance, related_dict) instance.save() return instance @@ -157,12 +154,12 @@ class Meta: model = MeasurementType fields = ["name", "url_slug", "dtype", "creator", "description", "units", "annotations", "choices"] + class MeasurementTypeElasticSerializer(serializers.ModelSerializer): units = UnitSerializer(many=True, allow_null=True) - annotations = AnnotationSerializer(many=True,allow_null=True) + annotations = AnnotationSerializer(many=True, allow_null=True) choices = ChoiceSerializer(many=True, allow_null=True) class Meta: model = MeasurementType - fields = ["name", "url_slug", "dtype", "description","units", "annotations", "choices"] - + fields = ["name", "url_slug", "dtype", "description", "units", "annotations", "choices"] diff --git a/backend/pkdb_app/categorials/views.py b/backend/pkdb_app/categorials/views.py index 50c2f4c8..0156673c 100644 --- a/backend/pkdb_app/categorials/views.py +++ b/backend/pkdb_app/categorials/views.py @@ -37,18 +37,20 @@ class RouteViewSet(viewsets.ModelViewSet): permission_classes = (IsAdminOrCreator,) lookup_field = "url_slug" + class FormViewSet(viewsets.ModelViewSet): queryset = Form.objects.all() serializer_class = FormSerializer permission_classes = (IsAdminOrCreator,) lookup_field = "url_slug" + class MeasurementTypeElasticViewSet(DocumentViewSet): pagination_class = CustomPagination document = MeasurementTypeDocument serializer_class = MeasurementTypeElasticSerializer lookup_field = 'url_slug' - filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend] + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] search_fields = ("name", "url_slug", "dtype", @@ -68,4 +70,4 @@ class MeasurementTypeElasticViewSet(DocumentViewSet): 'operator': 'and' } filter_fields = {'name': 'name.raw'} - ordering_fields ={'name': 'name.raw',"dtype":"dtype.raw"} + ordering_fields = {'name': 'name.raw', "dtype": "dtype.raw"} diff --git a/backend/pkdb_app/comments/admin.py b/backend/pkdb_app/comments/admin.py index c7a959e7..694323fa 100644 --- a/backend/pkdb_app/comments/admin.py +++ b/backend/pkdb_app/comments/admin.py @@ -1,3 +1 @@ from django.contrib import admin - - diff --git a/backend/pkdb_app/comments/apps.py b/backend/pkdb_app/comments/apps.py index 743aa09f..5e25df28 100644 --- a/backend/pkdb_app/comments/apps.py +++ b/backend/pkdb_app/comments/apps.py @@ -3,4 +3,3 @@ class CommentsConfig(AppConfig): name = "comments" - diff --git a/backend/pkdb_app/comments/documents.py b/backend/pkdb_app/comments/documents.py index dcd0657e..a81a56ec 100644 --- a/backend/pkdb_app/comments/documents.py +++ b/backend/pkdb_app/comments/documents.py @@ -5,6 +5,7 @@ text_field from pkdb_app.comments.models import Comment, Description + # ------------------------------------ # Elastic Comment Document # ------------------------------------ @@ -49,4 +50,3 @@ class Django: class Index: name = 'descriptions' settings = elastic_settings - diff --git a/backend/pkdb_app/comments/models.py b/backend/pkdb_app/comments/models.py index ad7b6c5d..914377f1 100644 --- a/backend/pkdb_app/comments/models.py +++ b/backend/pkdb_app/comments/models.py @@ -18,7 +18,6 @@ class Comment(models.Model): - text = models.TextField(null=True) user = models.ForeignKey( User, related_name="comments", null=True, on_delete=models.CASCADE @@ -114,4 +113,3 @@ class Description(models.Model): class Meta: ordering = ['pk'] - diff --git a/backend/pkdb_app/comments/serializers.py b/backend/pkdb_app/comments/serializers.py index b5b6a75a..cb82aa8a 100644 --- a/backend/pkdb_app/comments/serializers.py +++ b/backend/pkdb_app/comments/serializers.py @@ -54,7 +54,6 @@ def _validate_comment(self, data): "detail": {str(data)}, }) - def to_internal_value(self, data): self._validate_comment(data) user = self.get_or_val_error(User, username=data[0]) @@ -69,7 +68,6 @@ def to_representation(self, instance): # Read Serializer ############################################################################################### class DescriptionElasticSerializer(serializers.HyperlinkedModelSerializer): - class Meta: fields = ["pk", "text"] model = Description @@ -79,5 +77,5 @@ class CommentElasticSerializer(serializers.HyperlinkedModelSerializer): user = UserElasticSerializer(read_only=True) class Meta: - fields = ["pk", "text","user"] - model = Comment \ No newline at end of file + fields = ["pk", "text", "user"] + model = Comment diff --git a/backend/pkdb_app/comments/views.py b/backend/pkdb_app/comments/views.py index 6578ecd8..3a5f80ef 100644 --- a/backend/pkdb_app/comments/views.py +++ b/backend/pkdb_app/comments/views.py @@ -1,4 +1,3 @@ - # Create your views here. from django_elasticsearch_dsl_drf.filter_backends import FilteringFilterBackend, CompoundSearchFilterBackend, \ IdsFilterBackend, MultiMatchSearchFilterBackend @@ -11,26 +10,24 @@ class ElasticCommentViewSet(DocumentViewSet): document = CommentDocument serializer_class = CommentElasticSerializer lookup_field = "id" - filter_backends = [FilteringFilterBackend,IdsFilterBackend,MultiMatchSearchFilterBackend] + filter_backends = [FilteringFilterBackend, IdsFilterBackend, MultiMatchSearchFilterBackend] - search_fields = ('text','user.username','user.first_name','user.last_name') + search_fields = ('text', 'user.username', 'user.first_name', 'user.last_name') multi_match_search_fields = {field: {"boost": 1} for field in search_fields} multi_match_options = { 'operator': 'and' } - filter_fields = {'text': 'text','user_lastname':'user.last_name.raw',} + filter_fields = {'text': 'text', 'user_lastname': 'user.last_name.raw', } class ElasticDescriptionViewSet(DocumentViewSet): document = DescriptionDocument serializer_class = DescriptionElasticSerializer lookup_field = "id" - filter_backends = [FilteringFilterBackend,IdsFilterBackend,MultiMatchSearchFilterBackend] + filter_backends = [FilteringFilterBackend, IdsFilterBackend, MultiMatchSearchFilterBackend] search_fields = ('text',) multi_match_search_fields = {field: {"boost": 1} for field in search_fields} multi_match_options = { 'operator': 'and' } - filter_fields = {'text': 'text.raw',} - - + filter_fields = {'text': 'text.raw', } diff --git a/backend/pkdb_app/documents.py b/backend/pkdb_app/documents.py index 022e6c5c..f80c05a9 100644 --- a/backend/pkdb_app/documents.py +++ b/backend/pkdb_app/documents.py @@ -1,4 +1,4 @@ -from django_elasticsearch_dsl import fields, DEDField, Object, collections +from django_elasticsearch_dsl import fields, DEDField, Object, collections from django_elasticsearch_dsl_drf.viewsets import DocumentViewSet from elasticsearch_dsl import analyzer, token_filter, Q @@ -23,7 +23,6 @@ min_gram=1, max_gram=20 ) - autocomplete_search = analyzer( 'autocomplete_search', tokenizer="standard", @@ -59,7 +58,7 @@ def text_field(attr): analyzer=autocomplete, search_analyzer=autocomplete_search, fields={'raw': fields.KeywordField()} - ) + ) class ObjectField(DEDField, Object): @@ -69,6 +68,7 @@ class ObjectField(DEDField, Object): This looks copy-pasted from some solution. Please provide short description and link to solution. """ + def _get_inner_field_data(self, obj, field_value_to_ignore=None): data = {} if hasattr(self, 'properties'): @@ -83,7 +83,8 @@ def _get_inner_field_data(self, obj, field_value_to_ignore=None): obj, field_value_to_ignore ) else: - for name, field in self._doc_class._doc_type.mapping.properties._params.get('properties', {}).items(): # noqa + for name, field in self._doc_class._doc_type.mapping.properties._params.get('properties', + {}).items(): # noqa if not isinstance(field, DEDField): continue @@ -128,7 +129,7 @@ def get_queryset(self): qs = search.query( Q('match', access__raw=PUBLIC) | Q('match', allowed_users__raw=self.request.user.username) - ) + ) # ) # qs = qs.filter( @@ -145,4 +146,3 @@ def get_queryset(self): ) return qs - diff --git a/backend/pkdb_app/interventions/documents.py b/backend/pkdb_app/interventions/documents.py index c81942f7..e76f5160 100644 --- a/backend/pkdb_app/interventions/documents.py +++ b/backend/pkdb_app/interventions/documents.py @@ -3,6 +3,7 @@ from ..documents import string_field, elastic_settings, ObjectField from ..interventions.models import Intervention + # ------------------------------------ # Elastic Intervention Document # ------------------------------------ diff --git a/backend/pkdb_app/interventions/managers.py b/backend/pkdb_app/interventions/managers.py index 82323fb7..fbf6ef3c 100644 --- a/backend/pkdb_app/interventions/managers.py +++ b/backend/pkdb_app/interventions/managers.py @@ -8,7 +8,6 @@ class InterventionSetManager(models.Manager): def create(self, *args, **kwargs): - intervention_exs = kwargs.pop('intervention_exs', []) descriptions = kwargs.pop('descriptions', []) comments = kwargs.pop('comments', []) @@ -27,7 +26,6 @@ def create(self, *args, **kwargs): class InterventionExManager(models.Manager): def create(self, *args, **kwargs): - interventions = kwargs.pop('interventions', []) comments = kwargs.pop('comments', []) descriptions = kwargs.pop('descriptions', []) diff --git a/backend/pkdb_app/interventions/models.py b/backend/pkdb_app/interventions/models.py index 01c7cfcb..41f1b2b8 100644 --- a/backend/pkdb_app/interventions/models.py +++ b/backend/pkdb_app/interventions/models.py @@ -13,6 +13,7 @@ from pkdb_app.categorials.behaviours import Normalizable, ExMeasurementTypeable + # ------------------------------------------------- # Intervention # ------------------------------------------------- diff --git a/backend/pkdb_app/interventions/serializers.py b/backend/pkdb_app/interventions/serializers.py index f1b59863..fc5e2a44 100644 --- a/backend/pkdb_app/interventions/serializers.py +++ b/backend/pkdb_app/interventions/serializers.py @@ -4,7 +4,7 @@ import itertools from pkdb_app import utils -from pkdb_app.categorials.behaviours import VALUE_FIELDS_NO_UNIT, \ +from pkdb_app.categorials.behaviours import VALUE_FIELDS_NO_UNIT, \ MEASUREMENTTYPE_FIELDS, map_field, EX_MEASUREMENTTYPE_FIELDS from pkdb_app.categorials.models import Tissue, Route, Application, Form from pkdb_app.categorials.serializers import MeasurementTypeableSerializer, EXMeasurementTypeableSerializer @@ -14,7 +14,6 @@ from ..comments.serializers import DescriptionSerializer, CommentSerializer, DescriptionElasticSerializer, \ CommentElasticSerializer - from ..interventions.models import ( InterventionSet, Intervention, @@ -23,13 +22,7 @@ from ..serializers import ( ExSerializer, NA_VALUES, PkSerializer) -from ..subjects.models import DataFile - - - - - - +from ..subjects.models import DataFile # ---------------------------------- # Serializer FIELDS @@ -39,7 +32,6 @@ MEDICATION = "medication" DOSING = "dosing" - INTERVENTION_FIELDS = [ "name", "route", @@ -52,15 +44,16 @@ INTERVENTION_MAP_FIELDS = map_field(INTERVENTION_FIELDS) -OUTPUT_FIELDS = [ "tissue", "time", "time_unit"] +OUTPUT_FIELDS = ["tissue", "time", "time_unit"] + +OUTPUT_MAP_FIELDS = map_field(OUTPUT_FIELDS) + -OUTPUT_MAP_FIELDS = map_field(OUTPUT_FIELDS) # ---------------------------------- # Interventions # ---------------------------------- - class InterventionSerializer(MeasurementTypeableSerializer): route = utils.SlugRelatedField( slug_field="name", @@ -81,7 +74,6 @@ class Meta: model = Intervention fields = INTERVENTION_FIELDS + MEASUREMENTTYPE_FIELDS - def to_internal_value(self, data): data.pop("comments", None) data.pop("descriptions", None) @@ -93,26 +85,25 @@ def to_internal_value(self, data): _validate_requried_key(data, "measurement_type") measurement_type = data.get("measurement_type") - if any([measurement_type == MEDICATION,measurement_type == DOSING]): - _validate_requried_key(data,"substance") - _validate_requried_key(data,"route") - _validate_requried_key(data,"value") - _validate_requried_key(data,"unit") + if any([measurement_type == MEDICATION, measurement_type == DOSING]): + _validate_requried_key(data, "substance") + _validate_requried_key(data, "route") + _validate_requried_key(data, "value") + _validate_requried_key(data, "unit") if measurement_type == DOSING: _validate_requried_key(data, "form") _validate_requried_key(data, "application") - _validate_requried_key(data,"time") - _validate_requried_key(data,"time_unit") + _validate_requried_key(data, "time") + _validate_requried_key(data, "time_unit") application = data["application"] - allowed_applications = ["constant infusion","single dose"] + allowed_applications = ["constant infusion", "single dose"] if not application in allowed_applications: - raise serializers.ValidationError(f"Allowed applications for measurement_type <{DOSING}> are <{allowed_applications}>.You might want to select the measurement_type: qualitative dosing. With no requirements.") - + raise serializers.ValidationError( + f"Allowed applications for measurement_type <{DOSING}> are <{allowed_applications}>.You might want to select the measurement_type: qualitative dosing. With no requirements.") return super(serializers.ModelSerializer, self).to_internal_value(data) - def validate(self, attrs): try: # perform via dedicated function on categorials @@ -124,7 +115,6 @@ def validate(self, attrs): class InterventionExSerializer(EXMeasurementTypeableSerializer): - ###### source = serializers.PrimaryKeyRelatedField( queryset=DataFile.objects.all(), required=False, allow_null=True @@ -146,11 +136,11 @@ class InterventionExSerializer(EXMeasurementTypeableSerializer): class Meta: model = InterventionEx fields = ( - EXTERN_FILE_FIELDS - + INTERVENTION_FIELDS - + INTERVENTION_MAP_FIELDS - + EX_MEASUREMENTTYPE_FIELDS - + ["interventions", "comments","descriptions"] + EXTERN_FILE_FIELDS + + INTERVENTION_FIELDS + + INTERVENTION_MAP_FIELDS + + EX_MEASUREMENTTYPE_FIELDS + + ["interventions", "comments", "descriptions"] ) def to_internal_value(self, data): @@ -203,24 +193,24 @@ def to_internal_value(self, data): self.validate_wrong_keys(data) return data + def validate(self, attrs): intervention_exs = attrs.get("intervention_exs") - all_interventions = list(itertools.chain(*[intervention_ex.get("interventions") for intervention_ex in intervention_exs])) + all_interventions = list( + itertools.chain(*[intervention_ex.get("interventions") for intervention_ex in intervention_exs])) all_intervention_names = [intervention["name"] for intervention in all_interventions] duplicated_intervention_names = list_duplicates(all_intervention_names) if duplicated_intervention_names: - raise serializers.ValidationError( { - "intervention_set":"Itervention names are required to be unique within a study.", - "duplicated intervention names":duplicated_intervention_names + "intervention_set": "Itervention names are required to be unique within a study.", + "duplicated intervention names": duplicated_intervention_names }) return super().validate(attrs) - ############################################################################################### # Elastic Serializer ############################################################################################### @@ -233,11 +223,10 @@ class InterventionSetElasticSmallSerializer(serializers.HyperlinkedModelSerializ class Meta: model = InterventionSet - fields = ["pk","descriptions", "interventions","comments"] + fields = ["pk", "descriptions", "interventions", "comments"] - def get_interventions(self,obj): - - return list_of_pk("interventions",obj) + def get_interventions(self, obj): + return list_of_pk("interventions", obj) # Intervention related Serializer @@ -266,14 +255,14 @@ class InterventionElasticSerializer(serializers.ModelSerializer): class Meta: model = Intervention - fields = ["study_sid","study_name", "intervention_pk","raw_pk", "normed"] + INTERVENTION_FIELDS + MEASUREMENTTYPE_FIELDS - + fields = ["study_sid", "study_name", "intervention_pk", "raw_pk", + "normed"] + INTERVENTION_FIELDS + MEASUREMENTTYPE_FIELDS def to_representation(self, instance): rep = super().to_representation(instance) for field in VALUE_FIELDS_NO_UNIT + ["time"]: - try: - rep[field] = '{:.2e}'.format(rep[field]) - except (ValueError, TypeError): - pass + try: + rep[field] = '{:.2e}'.format(rep[field]) + except (ValueError, TypeError): + pass return rep diff --git a/backend/pkdb_app/interventions/views.py b/backend/pkdb_app/interventions/views.py index e26b8e1d..4d60e6bb 100644 --- a/backend/pkdb_app/interventions/views.py +++ b/backend/pkdb_app/interventions/views.py @@ -14,7 +14,6 @@ from ..pagination import CustomPagination - ############################################################################################### # Option Views ############################################################################################### @@ -41,14 +40,14 @@ def list(self, request): ############################################################################################### - class ElasticInterventionViewSet(AccessView): document = InterventionDocument serializer_class = InterventionElasticSerializer pagination_class = CustomPagination lookup_field = "id" - filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend] - search_fields = ('name','study','access','measurement_type','substance',"form","tissue","application",'route','time_unit') + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] + search_fields = ( + 'name', 'study', 'access', 'measurement_type', 'substance', "form", "tissue", "application", 'route', 'time_unit') multi_match_search_fields = {field: {"boost": 1} for field in search_fields} multi_match_options = { 'operator': 'and' @@ -56,19 +55,19 @@ class ElasticInterventionViewSet(AccessView): filter_fields = { 'study_sid': {'field': 'study_sid.raw', - 'lookups': [ - LOOKUP_QUERY_IN, - LOOKUP_QUERY_EXCLUDE, - - ], - }, - 'study_name': {'field': 'study_name.raw', 'lookups': [ LOOKUP_QUERY_IN, LOOKUP_QUERY_EXCLUDE, ], }, + 'study_name': {'field': 'study_name.raw', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, 'pk': {'field': 'pk', 'lookups': [ LOOKUP_QUERY_IN, @@ -76,7 +75,7 @@ class ElasticInterventionViewSet(AccessView): ], }, - 'normed':'normed', + 'normed': 'normed', 'raw_pk': 'raw_pk', 'name': 'name.raw', 'measurement_type': 'measurement_type.raw', @@ -98,9 +97,9 @@ class ElasticInterventionViewSet(AccessView): 'cv': 'cv', } ordering_fields = {'name': 'name.raw', - 'measurement_type':'measurement_type.raw', - 'choice':'choice.raw', - 'normed':'normed', - 'application':'application.raw', - 'substance':'substance.raw', - 'value':'value'} + 'measurement_type': 'measurement_type.raw', + 'choice': 'choice.raw', + 'normed': 'normed', + 'application': 'application.raw', + 'substance': 'substance.raw', + 'value': 'value'} diff --git a/backend/pkdb_app/logging_utils.py b/backend/pkdb_app/logging_utils.py index b81f06f1..52d940f4 100644 --- a/backend/pkdb_app/logging_utils.py +++ b/backend/pkdb_app/logging_utils.py @@ -3,8 +3,9 @@ """ import coloredlogs + coloredlogs.install( level="INFO", fmt="%(module)s:%(lineno)s %(funcName)s %(levelname) -10s %(message)s" # fmt="%(levelname) -10s %(asctime)s %(module)s:%(lineno)s %(funcName)s %(message)s" -) \ No newline at end of file +) diff --git a/backend/pkdb_app/normalization.py b/backend/pkdb_app/normalization.py index edbdc68c..95b8838f 100644 --- a/backend/pkdb_app/normalization.py +++ b/backend/pkdb_app/normalization.py @@ -26,7 +26,6 @@ def get_sd(se, count, cv, mean): def get_se(sd, count, cv, mean): - if isinstance(sd, list): sd = list(map(float, sd)) if isinstance(mean, list): @@ -42,7 +41,6 @@ def get_se(sd, count, cv, mean): if is_sd and is_count: - se = np.true_divide(sd, np.sqrt(count)) elif is_count and is_mean and is_cv: se = np.true_divide((np.multiply(cv, mean)), np.sqrt(count)) @@ -50,7 +48,6 @@ def get_se(sd, count, cv, mean): def get_cv(sd, count, se, mean): - if isinstance(sd, list): sd = list(map(float, sd)) if isinstance(mean, list): @@ -64,8 +61,6 @@ def get_cv(sd, count, se, mean): is_mean = mean is not None is_se = se is not None - - if is_sd and is_mean: cv = np.true_divide(sd, mean) elif is_se and is_count and is_mean: diff --git a/backend/pkdb_app/outputs/documents.py b/backend/pkdb_app/outputs/documents.py index 9eb0d251..70e92928 100644 --- a/backend/pkdb_app/outputs/documents.py +++ b/backend/pkdb_app/outputs/documents.py @@ -26,7 +26,7 @@ class OutputDocument(Document): choice = string_field("choice") ex = ObjectField(properties={ 'pk': string_field('pk')} - ) + ) normed = fields.BooleanField() calculated = fields.BooleanField() raw = ObjectField(properties={ @@ -73,7 +73,6 @@ class Index: } - # ------------------------------------ # Elastic Timecourse Document # ------------------------------------ @@ -107,7 +106,7 @@ class TimecourseDocument(Document): 'pk': fields.IntegerField()}, multi=True ) - value = fields.FloatField('null_value',multi=True) + value = fields.FloatField('null_value', multi=True) mean = fields.FloatField('null_mean', multi=True) median = fields.FloatField('null_median', multi=True) min = fields.FloatField('null_min', multi=True) @@ -142,7 +141,6 @@ class Index: settings = elastic_settings - @registry.register_document class TimecourseInterventionDocument(Document): study_sid = string_field('study_sid') @@ -153,14 +151,12 @@ class TimecourseInterventionDocument(Document): group_pk = fields.IntegerField('group_pk') individual_pk = fields.IntegerField('individual_pk') - tissue = string_field('tissue') time = fields.FloatField('time', multi=True) time_unit = string_field('time_unit') unit = string_field('unit') choice = string_field('choice') - # output fields value = fields.FloatField('value', multi=True) mean = fields.FloatField('mean', multi=True) @@ -202,8 +198,7 @@ class Index: def get_queryset(self): """Not mandatory but to improve performance we can select related in one sql request""" return super(TimecourseInterventionDocument, self).get_queryset().select_related( - 'intervention','timecourse') - + 'intervention', 'timecourse') @registry.register_document @@ -235,7 +230,6 @@ class OutputInterventionDocument(Document): sd = fields.FloatField('sd') cv = fields.FloatField('cv') - # for permissions access = string_field('access') allowed_users = fields.ObjectField( @@ -264,5 +258,4 @@ class Index: def get_queryset(self): """Not mandatory but to improve performance we can select related in one sql request""" return super(OutputInterventionDocument, self).get_queryset().select_related( - 'intervention','output') - + 'intervention', 'output') diff --git a/backend/pkdb_app/outputs/managers.py b/backend/pkdb_app/outputs/managers.py index 45be6c5b..dd87ca61 100644 --- a/backend/pkdb_app/outputs/managers.py +++ b/backend/pkdb_app/outputs/managers.py @@ -27,7 +27,6 @@ def create(self, *args, **kwargs): create_multiple(outputset, comments, 'comments') for output_ex in output_exs: - intervention_ids = output_ex.pop('interventions', []) output_ex_instance = outputset.output_exs.create(**output_ex) output_ex_instance.interventions.add(*intervention_ids) @@ -51,17 +50,15 @@ def create(self, *args, **kwargs): comments = kwargs.pop('comments', []) descriptions = kwargs.pop('descriptions', []) - output_ex = super().create(*args, **kwargs) output_ex.interventions.add(*interventions) create_multiple(output_ex, comments, 'comments') create_multiple(output_ex, descriptions, 'descriptions') - outputs_dj = create_multiple(output_ex, outputs, 'outputs') Output = apps.get_model('outputs', 'Output') - outputs_normed = create_multiple_bulk_normalized(outputs_dj,Output) + outputs_normed = create_multiple_bulk_normalized(outputs_dj, Output) for output in outputs_normed: output._interventions.add(*output.interventions.all()) @@ -84,7 +81,6 @@ def create(self, *args, **kwargs): comments = kwargs.pop('comments', []) descriptions = kwargs.pop('descriptions', []) - timecourse_ex = super().create(*args, **kwargs) timecourse_ex.interventions.add(*interventions) create_multiple(timecourse_ex, comments, 'comments') @@ -93,14 +89,13 @@ def create(self, *args, **kwargs): timecourses_dj = create_multiple(timecourse_ex, timecourses, 'timecourses') Timecourse = type(timecourses_dj[0]) - Output = apps.get_model('outputs','Output') + Output = apps.get_model('outputs', 'Output') - timecourses_normed = create_multiple_bulk_normalized(timecourses_dj, Timecourse) + timecourses_normed = create_multiple_bulk_normalized(timecourses_dj, Timecourse) for timecourse in timecourses_normed: timecourse._interventions.add(*timecourse.interventions.all()) - # calculate pharmacokinetics data from normalized timecourses for timecourse in timecourses_normed: if timecourse.measurement_type.name == "concentration" and timecourse.normed: @@ -109,19 +104,18 @@ def create(self, *args, **kwargs): _ = variables.pop("bodyweight_type", None) pk = f_pk(**variables) - key_mapping = {"auc": MeasurementType.objects.get(name="auc_end"), - "aucinf":MeasurementType.objects.get(name="auc_inf"), - "cl":MeasurementType.objects.get(name="clearance"), - "cmax":MeasurementType.objects.get(name="cmax"), - "kel":MeasurementType.objects.get(name="kel"), - "thalf":MeasurementType.objects.get(name="thalf"), + "aucinf": MeasurementType.objects.get(name="auc_inf"), + "cl": MeasurementType.objects.get(name="clearance"), + "cmax": MeasurementType.objects.get(name="cmax"), + "kel": MeasurementType.objects.get(name="kel"), + "thalf": MeasurementType.objects.get(name="thalf"), "tmax": MeasurementType.objects.get(name="tmax"), - "vd":MeasurementType.objects.get(name="vd"), + "vd": MeasurementType.objects.get(name="vd"), } outputs = [] - for key in ["auc", "aucinf", "cl", "cmax", "kel", "thalf", "vd","tmax"]: + for key in ["auc", "aucinf", "cl", "cmax", "kel", "thalf", "vd", "tmax"]: pk_unit = pk[f"{key}_unit"] if not np.isnan(pk[key]): output_dict = {} diff --git a/backend/pkdb_app/outputs/models.py b/backend/pkdb_app/outputs/models.py index ab4ff65a..f5efc5ca 100644 --- a/backend/pkdb_app/outputs/models.py +++ b/backend/pkdb_app/outputs/models.py @@ -42,8 +42,6 @@ def outputs(self): outputs_timecourses = Output.objects.filter(timecourse__in=self.timecourses.all()) return outputs | outputs_timecourses - - @property def outputs_normed(self): outputs = self.outputs.filter(normed=True) @@ -77,6 +75,7 @@ def count_timecourses(self): class AbstractOutput(models.Model): time = models.FloatField(null=True) time_unit = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) + class Meta: abstract = True @@ -113,21 +112,19 @@ class OutputEx(Externable, individual_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) interventions_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) - tissue = models.CharField( max_length=CHAR_MAX_LENGTH, null=True) - - + tissue = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) objects = OutputExManager() -class Output(AbstractOutput,Normalizable, Accessible): +class Output(AbstractOutput, Normalizable, Accessible): """ Storage of data sets. """ group = models.ForeignKey(Group, null=True, blank=True, on_delete=models.CASCADE) individual = models.ForeignKey(Individual, null=True, blank=True, on_delete=models.CASCADE) _interventions = models.ManyToManyField(Intervention, through="OutputIntervention") - tissue = models.ForeignKey(Tissue,related_name="outputs", null=True, blank=True, on_delete=models.CASCADE) + tissue = models.ForeignKey(Tissue, related_name="outputs", null=True, blank=True, on_delete=models.CASCADE) ex = models.ForeignKey(OutputEx, related_name="outputs", on_delete=models.CASCADE, null=True) @@ -151,7 +148,6 @@ def interventions(self): else: return self.raw._interventions - @property def study(self): @@ -165,9 +161,6 @@ def study(self): except AttributeError: return None - - - # for elastic search. NaNs are not allowed in elastic search def null_attr(self, attr): @@ -257,7 +250,7 @@ class TimecourseEx( individual_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) interventions_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) - tissue = models.CharField( max_length=CHAR_MAX_LENGTH, null=True) + tissue = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) objects = TimecourseExManager() @@ -273,7 +266,6 @@ class Timecourse(AbstractOutput, Normalizable, Accessible): ex = models.ForeignKey(TimecourseEx, related_name="timecourses", on_delete=models.CASCADE) tissue = models.ForeignKey(Tissue, related_name="timecourses", null=True, blank=True, on_delete=models.CASCADE) - value = ArrayField(models.FloatField(null=True), null=True) mean = ArrayField(models.FloatField(null=True), null=True) median = ArrayField(models.FloatField(null=True), null=True) @@ -304,7 +296,6 @@ def interventions(self): def study(self): return self.ex.outputset.study - @property def figure(self): try: @@ -334,27 +325,22 @@ def add_error_measures(self): if isinstance(cv, np.ndarray): self.cv = list(cv) - def normalize(self): '''Normalizes timecourse.''' - factor, unit = self.remove_substance_dimension() if unit: if ureg(unit) != ureg(self.unit): for key, value in self.norm_fields.items(): if value is not None: - - list_norm_values = list(factor*np.array(value)) + list_norm_values = list(factor * np.array(value)) setattr(self, key, list_norm_values) self.unit = unit else: self.unit = str(ureg(self.unit).u) - - if not self.is_norm: for key, value in self.norm_fields.items(): if value is not None: @@ -370,7 +356,6 @@ def normalize(self): self.time = list(norm_times.m) self.time_unit = TIME_NORM_UNIT - # for elastic search. NaNs are not allowed in elastic search @staticmethod def _any_not_json(value): @@ -421,7 +406,8 @@ def related_subject(self): return self.individual def get_bodyweight(self): - weight_measurememnt_type = self.related_subject.characteristica_all_normed.filter(measurement_type__name="weight") + weight_measurememnt_type = self.related_subject.characteristica_all_normed.filter( + measurement_type__name="weight") return weight_measurememnt_type def get_dosing(self): @@ -451,7 +437,6 @@ def get_pharmacokinetic_variables(self): pk_dict["t"] = pd.Series(self.time) pk_dict["t_unit"] = self.time_unit - # concentration # FIXME: the timecourse data must be filtered based on the dosing times # (or alternatively this should be handled in the pk calculation) @@ -488,8 +473,7 @@ def get_pharmacokinetic_variables(self): pk_dict["vd_unit"] = str(vd_unit) pk_dict["dose"] = dosing.value if dosing.time: - pk_dict["intervention_time"] = (ureg(dosing.time_unit)*dosing.time).to(self.time_unit).magnitude - + pk_dict["intervention_time"] = (ureg(dosing.time_unit) * dosing.time).to(self.time_unit).magnitude pk_dict["dose_unit"] = dosing.unit @@ -627,7 +611,7 @@ def calculated(self): return self.output.calculated -class TimecourseIntervention(Accessible,models.Model): +class TimecourseIntervention(Accessible, models.Model): timecourse = models.ForeignKey(Timecourse, on_delete=models.CASCADE) intervention = models.ForeignKey(Intervention, on_delete=models.CASCADE) @@ -638,7 +622,6 @@ class Meta: def study(self): return self.intervention.study - @property def intervention_pk(self): return self.intervention.pk @@ -657,7 +640,6 @@ def individual_name(self): if self.timecourse.individual: return self.timecourse.individual.name - @property def group_name(self): if self.timecourse.group: @@ -736,4 +718,4 @@ def substance(self): @property def normed(self): - return self.timecourse.normed \ No newline at end of file + return self.timecourse.normed diff --git a/backend/pkdb_app/outputs/serializers.py b/backend/pkdb_app/outputs/serializers.py index 6661502d..5ca2838b 100644 --- a/backend/pkdb_app/outputs/serializers.py +++ b/backend/pkdb_app/outputs/serializers.py @@ -20,7 +20,6 @@ from ..substances.models import Substance from ..subjects.models import Group, DataFile, Individual - from .models import ( Output, OutputSet, @@ -39,12 +38,11 @@ # ---------------------------------- from ..utils import list_of_pk, _validate_requried_key - - -OUTPUT_FIELDS = ["tissue", "time", "time_unit"] +OUTPUT_FIELDS = ["tissue", "time", "time_unit"] OUTPUT_MAP_FIELDS = map_field(OUTPUT_FIELDS) + # ---------------------------------- # Outputs # ---------------------------------- @@ -74,8 +72,6 @@ class OutputSerializer(MeasurementTypeableSerializer): required=False ) - - class Meta: model = Output fields = OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS + ["group", "individual", "interventions"] @@ -94,7 +90,7 @@ def validate(self, attrs): self._validate_group_output(attrs) self.validate_group_individual_output(attrs) - _validate_requried_key(attrs,"measurement_type") + _validate_requried_key(attrs, "measurement_type") _validate_requried_key(attrs, "substance") _validate_requried_key(attrs, "tissue") _validate_requried_key(attrs, "interventions") @@ -105,9 +101,6 @@ def validate(self, attrs): except ValueError as err: raise serializers.ValidationError(err) - - - return super().validate(attrs) @@ -128,8 +121,6 @@ def to_representation(self, instance): intervention.name for intervention in instance.interventions.all() ] - - return rep @@ -173,20 +164,20 @@ class OutputExSerializer(BaseOutputExSerializer): class Meta: model = OutputEx fields = ( - EXTERN_FILE_FIELDS - + OUTPUT_FIELDS - + OUTPUT_MAP_FIELDS - + EX_MEASUREMENTTYPE_FIELDS - + ["group", "individual", "interventions"] - + [ - "group_map", - "individual_map", - "interventions_map", - "outputs", - "comments", - "descriptions" - - ] + EXTERN_FILE_FIELDS + + OUTPUT_FIELDS + + OUTPUT_MAP_FIELDS + + EX_MEASUREMENTTYPE_FIELDS + + ["group", "individual", "interventions"] + + [ + "group_map", + "individual_map", + "interventions_map", + "outputs", + "comments", + "descriptions" + + ] ) def to_internal_value(self, data): @@ -209,8 +200,6 @@ def to_internal_value(self, data): data = self.to_internal_related_fields(data) self.validate_wrong_keys(data) - - return super(serializers.ModelSerializer, self).to_internal_value(data) def validate_figure(self, value): @@ -219,7 +208,6 @@ def validate_figure(self, value): class TimecourseSerializer(BaseOutputExSerializer): - group = serializers.PrimaryKeyRelatedField( queryset=Group.objects.all(), read_only=False, required=False, allow_null=True ) @@ -256,14 +244,13 @@ class TimecourseSerializer(BaseOutputExSerializer): required=False ) - class Meta: model = Timecourse fields = OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS + ["group", "individual", "interventions"] def to_internal_value(self, data): data.pop("comments", None) - data.pop("descriptions",None) + data.pop("descriptions", None) data = self.to_internal_related_fields(data) self.validate_wrong_keys(data) return super(serializers.ModelSerializer, self).to_internal_value(data) @@ -273,11 +260,11 @@ def validate(self, attrs): self._validate_group_output(attrs) self.validate_group_individual_output(attrs) - _validate_requried_key(attrs,"substance") - _validate_requried_key(attrs,"interventions") - _validate_requried_key(attrs,"tissue") - _validate_requried_key(attrs,"time") - _validate_requried_key(attrs,"measurement_type") + _validate_requried_key(attrs, "substance") + _validate_requried_key(attrs, "interventions") + _validate_requried_key(attrs, "tissue") + _validate_requried_key(attrs, "time") + _validate_requried_key(attrs, "measurement_type") self._validate_time_unit(attrs) self._validate_time(attrs["time"]) @@ -290,11 +277,9 @@ def validate(self, attrs): return super().validate(attrs) - def _validate_time(self,time): + def _validate_time(self, time): if any(np.isnan(np.array(time))): - raise serializers.ValidationError({"time":"no timepoints are allowed to be nan", "detail":time}) - - + raise serializers.ValidationError({"time": "no timepoints are allowed to be nan", "detail": time}) class TimecourseExSerializer(BaseOutputExSerializer): @@ -336,13 +321,13 @@ class TimecourseExSerializer(BaseOutputExSerializer): class Meta: model = TimecourseEx fields = ( - EXTERN_FILE_FIELDS - + OUTPUT_FIELDS - + OUTPUT_MAP_FIELDS - + EX_MEASUREMENTTYPE_FIELDS - + ["group", "individual", "interventions"] - + ["group_map", "individual_map", "interventions_map"] - + ["timecourses", "comments","descriptions"] + EXTERN_FILE_FIELDS + + OUTPUT_FIELDS + + OUTPUT_MAP_FIELDS + + EX_MEASUREMENTTYPE_FIELDS + + ["group", "individual", "interventions"] + + ["group_map", "individual_map", "interventions_map"] + + ["timecourses", "comments", "descriptions"] ) def to_internal_value(self, data): @@ -364,7 +349,6 @@ def to_internal_value(self, data): data["timecourses"] = timecourses - data = self.to_internal_related_fields(data) self.validate_wrong_keys(data) @@ -375,7 +359,6 @@ def validate_figure(self, value): return value - class OutputSetSerializer(ExSerializer): """ OutputSet @@ -398,14 +381,12 @@ class Meta: model = OutputSet fields = ["descriptions", "timecourse_exs", "output_exs", "comments"] - def to_internal_value(self, data): data = super().to_internal_value(data) self.validate_wrong_keys(data) return data - ############################################################################################### # Elastic Serializer ############################################################################################### @@ -418,33 +399,36 @@ class OutputSetElasticSmallSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = OutputSet - fields = ["pk","descriptions", "outputs", "timecourses", "comments"] + fields = ["pk", "descriptions", "outputs", "timecourses", "comments"] - def get_outputs(self,obj): - return list_of_pk("outputs",obj) + def get_outputs(self, obj): + return list_of_pk("outputs", obj) - def get_timecourses(self,obj): + def get_timecourses(self, obj): return list_of_pk("timecourses", obj) + class OutputInterventionSerializer(serializers.ModelSerializer): class Meta: model = OutputIntervention - fields = ["study_sid", "study_name", "output_pk", "intervention_pk", "group_pk", "individual_pk", "normed", "calculated"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS - + fields = ["study_sid", "study_name", "output_pk", "intervention_pk", "group_pk", "individual_pk", "normed", + "calculated"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS def to_representation(self, instance): rep = super().to_representation(instance) for field in VALUE_FIELDS_NO_UNIT: - try: - rep[field] = '{:.2e}'.format(rep[field]) - except (ValueError, TypeError): - pass + try: + rep[field] = '{:.2e}'.format(rep[field]) + except (ValueError, TypeError): + pass return rep + class TimecourseInterventionSerializer(serializers.ModelSerializer): class Meta: model = TimecourseIntervention - fields = ["study_sid", "study_name", "timecourse_pk", "intervention_pk", "group_pk", "individual_pk", "normed"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS + fields = ["study_sid", "study_name", "timecourse_pk", "intervention_pk", "group_pk", "individual_pk", + "normed"] + OUTPUT_FIELDS + MEASUREMENTTYPE_FIELDS def to_representation(self, instance): rep = super().to_representation(instance) @@ -462,7 +446,6 @@ def to_representation(self, instance): return rep - class OutputElasticSerializer(serializers.HyperlinkedModelSerializer): group = GroupSmallElasticSerializer() individual = IndividualSmallElasticSerializer() @@ -484,26 +467,23 @@ class OutputElasticSerializer(serializers.HyperlinkedModelSerializer): timecourse = PkSerializer() allowed_users = UserElasticSerializer(many=True, read_only=True) - class Meta: - model = Output - fields = ( - ["pk","study"] + model = Output + fields = ( + ["pk", "study"] + OUTPUT_FIELDS + VALUE_FIELDS + MEASUREMENTTYPE_FIELDS + ["access", "allowed_users"] + ["group", "individual", "normed", "raw", "calculated", "timecourse", "interventions"]) - - def to_representation(self, instance): rep = super().to_representation(instance) for field in VALUE_FIELDS_NO_UNIT: - try: - rep[field] = '{:.2e}'.format(rep[field]) - except (ValueError, TypeError): - pass + try: + rep[field] = '{:.2e}'.format(rep[field]) + except (ValueError, TypeError): + pass return rep @@ -514,7 +494,7 @@ class OutputAnalysisSerializer(serializers.Serializer): group_pk = serializers.IntegerField(allow_null=True) timecourse_pk = serializers.IntegerField(allow_null=True) - study = serializers.CharField(allow_null=True) + study = serializers.CharField(allow_null=True) tissue = serializers.CharField() substance = serializers.CharField(allow_null=True) measurement_type = serializers.CharField() @@ -532,7 +512,6 @@ class OutputAnalysisSerializer(serializers.Serializer): se = serializers.FloatField(allow_null=True) cv = serializers.FloatField(allow_null=True) - class Meta: fields = ( ["pk", "study"] @@ -542,16 +521,13 @@ class Meta: + ["group_pk", "individual_pk", "normed", "calculated", "timecourse_pk", "intervention_pk"]) - - class TimecourseElasticSerializer(serializers.HyperlinkedModelSerializer): group = GroupSmallElasticSerializer() - individual = IndividualSmallElasticSerializer() - interventions = InterventionSmallElasticSerializer(many=True) + individual = IndividualSmallElasticSerializer() + interventions = InterventionSmallElasticSerializer(many=True) measurement_type = serializers.CharField() tissue = serializers.CharField() - raw = PkSerializer() pharmacokinetics = PkSerializer(many=True) substance = serializers.CharField() @@ -559,15 +535,14 @@ class TimecourseElasticSerializer(serializers.HyperlinkedModelSerializer): allowed_users = UserElasticSerializer(many=True, read_only=True) class Meta: - model = Timecourse - fields = ( - ["pk","study"] + model = Timecourse + fields = ( + ["pk", "study"] + MEASUREMENTTYPE_FIELDS + OUTPUT_FIELDS + VALUE_FIELDS - +["access","allowed_users"] - + ["group", "individual", "normed","raw","pharmacokinetics", "interventions","figure"]) - + + ["access", "allowed_users"] + + ["group", "individual", "normed", "raw", "pharmacokinetics", "interventions", "figure"]) def to_representation(self, instance): rep = super().to_representation(instance) diff --git a/backend/pkdb_app/outputs/views.py b/backend/pkdb_app/outputs/views.py index 6681341b..2cb3c9db 100644 --- a/backend/pkdb_app/outputs/views.py +++ b/backend/pkdb_app/outputs/views.py @@ -15,6 +15,8 @@ import pandas as pd import numpy as np import math + + ############################################################################################### # Option Views ############################################################################################### @@ -27,28 +29,28 @@ def get_options(): options = {} options["measurememnt_types"] = {k.name: k._asdict() for k in MeasurementType.objects.all()} options["substances"] = reverse('substances_elastic-list') - options["tissue"] = [k.name for k in Tissue.objects.all()] + options["tissue"] = [k.name for k in Tissue.objects.all()] return options def list(self, request): return Response(self.get_options()) + class TimecourseOptionViewSet(viewsets.ViewSet): @staticmethod def get_options(): - options = {} - options["measurememnt_types"] = {k.name: k._asdict() for k in MeasurementType.objects.all()} - options["substances"] = reverse('substances_elastic-list') - options["tissue"] = [k.name for k in Tissue.objects.all()] - return options + options = {} + options["measurememnt_types"] = {k.name: k._asdict() for k in MeasurementType.objects.all()} + options["substances"] = reverse('substances_elastic-list') + options["tissue"] = [k.name for k in Tissue.objects.all()] + return options def list(self, request): return Response(self.get_options()) - ############################################################################################### # Elastic Views ############################################################################################### @@ -58,8 +60,9 @@ class ElasticOutputViewSet(AccessView): serializer_class = OutputElasticSerializer pagination_class = CustomPagination lookup_field = "id" - filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend] - search_fields = ('study','measurement_type','substance','group.name', 'individual.name', "tissue",'time_unit','interventions.name') + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] + search_fields = ('study', 'measurement_type', 'substance', 'group.name', 'individual.name', "tissue", 'time_unit', + 'interventions.name') multi_match_search_fields = {field: {"boost": 1} for field in search_fields} multi_match_options = { 'operator': 'and' @@ -88,24 +91,25 @@ class ElasticOutputViewSet(AccessView): LOOKUP_QUERY_IN, ], }, - 'tissue':"tissue.raw", - 'time':'time.raw', + 'tissue': "tissue.raw", + 'time': 'time.raw', 'choice': 'choice.raw', - 'normed':'normed', - 'calculated':'calculated', - 'unit':'unit.raw', - 'substance':'substance.raw', - 'measurement_type':'measurement_type.raw', - } + 'normed': 'normed', + 'calculated': 'calculated', + 'unit': 'unit.raw', + 'substance': 'substance.raw', + 'measurement_type': 'measurement_type.raw', + } - ordering_fields = {'measurement_type':'measurement_type.raw', - 'tissue':'tissue.raw', - 'substance':'substance', + ordering_fields = {'measurement_type': 'measurement_type.raw', + 'tissue': 'tissue.raw', + 'substance': 'substance', 'group': 'group.name', 'individual': 'individual.name', - 'value':'value', + 'value': 'value', } + class OutputInterventionViewSet(AccessView): document = OutputInterventionDocument serializer_class = OutputInterventionSerializer @@ -119,7 +123,7 @@ class OutputInterventionViewSet(AccessView): 'operator': 'and' } filter_fields = { - 'study_sid': {'field': 'study_sid.raw', + 'study_sid': {'field': 'study_sid.raw', 'lookups': [ LOOKUP_QUERY_IN, LOOKUP_QUERY_EXCLUDE, @@ -127,12 +131,12 @@ class OutputInterventionViewSet(AccessView): ], }, 'study_name': {'field': 'study_name.raw', - 'lookups': [ - LOOKUP_QUERY_IN, - LOOKUP_QUERY_EXCLUDE, + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, - ], - }, + ], + }, 'output_pk': {'field': 'output_pk', 'lookups': [ LOOKUP_QUERY_IN, @@ -140,11 +144,11 @@ class OutputInterventionViewSet(AccessView): ], }, 'intervention_pk': {'field': 'intervention_pk', - 'lookups': [ - LOOKUP_QUERY_IN, - LOOKUP_QUERY_EXCLUDE, - ], - }, + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, 'group_pk': {'field': 'group_pk', 'lookups': [ LOOKUP_QUERY_IN, @@ -167,8 +171,7 @@ class OutputInterventionViewSet(AccessView): 'choice': 'choice.raw', 'unit': 'unit.raw', - - } + } ordering_fields = {'measurement_type': 'measurement_type.raw', 'tissue': 'tissue.raw', 'substance': 'substance.raw', @@ -179,7 +182,6 @@ class OutputInterventionViewSet(AccessView): class TimecourseInterventionViewSet(AccessView): - document = TimecourseInterventionDocument serializer_class = TimecourseInterventionSerializer pagination_class = CustomPagination @@ -199,11 +201,11 @@ class TimecourseInterventionViewSet(AccessView): ], }, 'study_name': {'field': 'study_name.raw', - 'lookups': [ - LOOKUP_QUERY_IN, - LOOKUP_QUERY_EXCLUDE, - ], - }, + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, 'tissue': "tissue.raw", 'time': 'time.raw', 'time_unit': 'time_unit.raw', @@ -213,30 +215,30 @@ class TimecourseInterventionViewSet(AccessView): 'substance': 'substance.raw', 'measurement_type': 'measurement_type.raw', 'group_pk': {'field': 'group_pk', - 'lookups': [ - LOOKUP_QUERY_IN, - LOOKUP_QUERY_EXCLUDE, - ], - }, + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }, 'timecourse_pk': {'field': 'timecourse_pk', - 'lookups': [ - LOOKUP_QUERY_IN, - LOOKUP_QUERY_EXCLUDE, + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, - ], - }, + ], + }, 'individual_pk': {'field': 'individual_pk', - 'lookups': [ - LOOKUP_QUERY_IN, - LOOKUP_QUERY_EXCLUDE, - - ]}, - 'intervention_pk': {'field': 'intervention_pk', 'lookups': [ LOOKUP_QUERY_IN, LOOKUP_QUERY_EXCLUDE, - ], - }} + + ]}, + 'intervention_pk': {'field': 'intervention_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + ], + }} ordering_fields = {'measurement_type': 'measurement_type.raw', 'tissue': 'tissue.raw', 'substance': 'substance.raw', @@ -250,8 +252,9 @@ class ElasticTimecourseViewSet(AccessView): serializer_class = TimecourseElasticSerializer pagination_class = CustomPagination lookup_field = "id" - filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend] - search_fields = ('study','measurement_type','substance',"tissue",'time_unit','group.name', 'individual.name','interventions.name') + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] + search_fields = ('study', 'measurement_type', 'substance', "tissue", 'time_unit', 'group.name', 'individual.name', + 'interventions.name') multi_match_search_fields = {field: {"boost": 1} for field in search_fields} multi_match_options = { 'operator': 'and' @@ -271,9 +274,9 @@ class ElasticTimecourseViewSet(AccessView): LOOKUP_QUERY_IN, ], }} - ordering_fields = {'measurement_type':'measurement_type.raw', - 'tissue':'tissue.raw', - 'group':'group.name', + ordering_fields = {'measurement_type': 'measurement_type.raw', + 'tissue': 'tissue.raw', + 'group': 'group.name', 'individual': 'individual.name', - 'substance':'substance', + 'substance': 'substance', } diff --git a/backend/pkdb_app/serializers.py b/backend/pkdb_app/serializers.py index 6fcf0c28..17703f0e 100644 --- a/backend/pkdb_app/serializers.py +++ b/backend/pkdb_app/serializers.py @@ -107,7 +107,7 @@ def transform_map_fields(data): transformed_data[key] = data.get(key) return transformed_data - def retransform_map_fields(self,data): + def retransform_map_fields(self, data): transformed_data = {} for k, v in data.items(): k = self.retransform_map_string(k) @@ -276,7 +276,7 @@ def df_from_file(self, source, subset): { "source": f"<{str(source)}> does not exist", "detail": type(source) - }) + }) else: raise serializers.ValidationError( { @@ -350,7 +350,7 @@ def make_entry(self, entry, template, data, source): entry_value = None if isinstance(entry_value, str): - entry_value = entry_value.strip() + entry_value = entry_value.strip() if keys[0] == "interventions": entry_value = self.interventions_from_string(entry_value) @@ -375,7 +375,7 @@ def entries_from_file(self, data): mappings = [] for key, value in template.items(): - if isinstance(value,str): + if isinstance(value, str): if "==" in value: mappings.append(value) @@ -406,7 +406,7 @@ def entries_from_file(self, data): ) else: for entry in df.itertuples(): - entry_dict = self.make_entry(entry, template, data,source) + entry_dict = self.make_entry(entry, template, data, source) entries.append(entry_dict) else: @@ -463,7 +463,7 @@ def array_from_file(self, data): else: array_dict = copy.deepcopy(template) self.dict_from_array(array_dict, df, data, source) - array_dicts =[array_dict] + array_dicts = [array_dict] else: raise serializers.ValidationError( @@ -578,7 +578,7 @@ def to_internal_related_fields(self, data): if data["interventions"]: interventions = [] - if isinstance(data["interventions"],str): + if isinstance(data["interventions"], str): data["interventions"] = self.interventions_from_string(data["interventions"]) for intervention in data["interventions"]: @@ -641,7 +641,7 @@ def validate_group_individual_output(output): raise serializers.ValidationError( { api_settings.NON_FIELD_ERRORS_KEY: f"Either group or individual allowed on output, remove group from output. " - f"The group of an individual is set on the individualset" + f"The group of an individual is set on the individualset" } ) @@ -789,7 +789,7 @@ class ReadSerializer(serializers.HyperlinkedModelSerializer): def to_representation(self, instance): rep = super().to_representation(instance) - for key,value in rep.items(): + for key, value in rep.items(): if isinstance(value, float): rep[key] = round(value, 2) return rep diff --git a/backend/pkdb_app/settings.py b/backend/pkdb_app/settings.py index a5a1f5b9..68bda5a4 100755 --- a/backend/pkdb_app/settings.py +++ b/backend/pkdb_app/settings.py @@ -5,7 +5,6 @@ import os from os.path import join - import dj_database_url from distutils.util import strtobool @@ -20,7 +19,7 @@ API_URL = API_BASE + "/api/v1" # ------------------------------------------------------------------------------------------------------------------ -#AUTHENTICATION_BACKENDS = ( +# AUTHENTICATION_BACKENDS = ( # # # Needed to login by username in Django admin, regardless of `allauth` ## 'rest_email_auth.authentication.VerifiedEmailBackend', @@ -28,18 +27,18 @@ # # # `allauth` specific authentication methods, such as login by e-mail # 'allauth.account.auth_backends.AuthenticationBackend', -#) +# ) -#AUTHENTICATION_BACKENDS = [ -#'rest_email_auth.authentication.VerifiedEmailBackend', -#'django.contrib.auth.backends.ModelBackend', -#] +# AUTHENTICATION_BACKENDS = [ +# 'rest_email_auth.authentication.VerifiedEmailBackend', +# 'django.contrib.auth.backends.ModelBackend', +# ] AUTHENTICATION_BACKENDS = ( # default 'django.contrib.auth.backends.ModelBackend', # email login - #'allauth.account.auth_backends.AuthenticationBackend', + # 'allauth.account.auth_backends.AuthenticationBackend', 'allauth.account.auth_backends.AuthenticationBackend', 'rest_email_auth.authentication.VerifiedEmailBackend', @@ -47,13 +46,12 @@ # The minimal settings dict required for the app REST_EMAIL_AUTH = { - 'EMAIL_VERIFICATION_URL': FRONTEND_BASE+'/#/verification/{key}', - 'PASSWORD_RESET_URL': FRONTEND_BASE+'/#/reset-password/{key}', + 'EMAIL_VERIFICATION_URL': FRONTEND_BASE + '/#/verification/{key}', + 'PASSWORD_RESET_URL': FRONTEND_BASE + '/#/reset-password/{key}', 'EMAIL_VERIFICATION_PASSWORD_REQUIRED': False, 'REGISTRATION_SERIALIZER': 'pkdb_app.users.serializers.UserRegistrationSerializer' } - INSTALLED_APPS = ( "django.contrib.admin", "django.contrib.auth", @@ -66,19 +64,18 @@ # Authentication 'rest_email_auth', "rest_framework.authtoken", # token authentication - #'rest_auth', - #'rest_auth.registration', + # 'rest_auth', + # 'rest_auth.registration', 'allauth', 'allauth.account', - # Third party apps "rest_framework", # utilities for rest apis "django_filters", # for filtering rest endpoints "rest_framework_swagger", "corsheaders", - #Elastic Search + # Elastic Search # Django Elasticsearch integration 'django_elasticsearch_dsl', @@ -104,7 +101,6 @@ ACCOUNT_USERNAME_MIN_LENGTH = 3 ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS = False - # https://docs.djangoproject.com/en/2.0/topics/http/middleware/ MIDDLEWARE = ( "django.middleware.security.SecurityMiddleware", @@ -239,7 +235,7 @@ # Django Rest Framework REST_FRAMEWORK = { - #'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', + # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', "DEFAULT_PAGINATION_CLASS": "pkdb_app.pagination.CustomPagination", 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', "PAGE_SIZE": int(os.getenv("DJANGO_PAGINATION_LIMIT", 20)), @@ -251,7 +247,7 @@ "rest_framework.renderers.JSONRenderer", "rest_framework.renderers.BrowsableAPIRenderer", ), - #"DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.AllowAny"], + # "DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.AllowAny"], "DEFAULT_AUTHENTICATION_CLASSES": ( "rest_framework.authentication.SessionAuthentication", "rest_framework.authentication.TokenAuthentication", diff --git a/backend/pkdb_app/static/css/main.css b/backend/pkdb_app/static/css/main.css index 1dd0c662..21008e37 100644 --- a/backend/pkdb_app/static/css/main.css +++ b/backend/pkdb_app/static/css/main.css @@ -1,96 +1,99 @@ .big-box { - border: 1px solid #eee; - -webkit-box-shadow: 0 3px 3px rgba(0,0,0,.5); - box-shadow: 0 3px 3px rgba(0,0,0,.5); - padding: 20px; - margin-top: 60px; - margin-bottom: 60px; + border: 1px solid #eee; + -webkit-box-shadow: 0 3px 3px rgba(0, 0, 0, .5); + box-shadow: 0 3px 3px rgba(0, 0, 0, .5); + padding: 20px; + margin-top: 60px; + margin-bottom: 60px; -/* - -webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; - -moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; - box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; -*/ + /* + -webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; + -moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; + box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset; + */ } .socialaccount_providers li a.socialaccount_provider { - rem-border: 1px solid #ddd; - border-radius: 10px; - rem-box-shadow: 2px 2px 8px rgba(0,0,0,.7); - -padding: 10px; - margin-bottom: 6px; - display: block; - width: 100%; - overflow: hidden; - rem-font-size: 1.2em; + rem-border: 1px solid #ddd; + border-radius: 10px; + rem-box-shadow: 2px 2px 8px rgba(0, 0, 0, .7); + -padding: 10px; + margin-bottom: 6px; + display: block; + width: 100%; + overflow: hidden; + rem-font-size: 1.2em; } .socialaccount_providers li a.socialaccount_provider:hover { - text-decoration: none; - box-shadow: 1px 1px 2px rgba(0,0,0,.7); + text-decoration: none; + box-shadow: 1px 1px 2px rgba(0, 0, 0, .7); } .socialaccount_providers li a.socialaccount_provider.facebook { - background: #4B67A3; /* technically gradient down to #3A579A */ - color: #fff; + background: #4B67A3; /* technically gradient down to #3A579A */ + color: #fff; } + .socialaccount_providers li a.socialaccount_provider.facebook:before { - font-family: FontAwesome; - font-size: 1.9em; - content: "\f082"; - display: inline-block; - padding-left: 8px; - padding-right: 8px; + font-family: FontAwesome; + font-size: 1.9em; + content: "\f082"; + display: inline-block; + padding-left: 8px; + padding-right: 8px; } .socialaccount_providers li a.socialaccount_provider.google { - background: #DE4931; - color: #fff; + background: #DE4931; + color: #fff; } + .socialaccount_providers li a.socialaccount_provider.google:before { - font-family: FontAwesome; - font-size: 1.9em; - content: "\f1a0"; - display: inline-block; - padding-left: 8px; - padding-right: 8px; + font-family: FontAwesome; + font-size: 1.9em; + content: "\f1a0"; + display: inline-block; + padding-left: 8px; + padding-right: 8px; } /* from http://konigi.com/tools/css-sticky-notes */ .sticky { - -webkit-box-shadow: #DDD 0px 1px 2px; - position: relative; - background-color: #F4F39E; - border-color: #DEE184; - text-align: center; - margin: 2.5em 0px; - padding: 1.5em 1em; - -webkit-box-shadow: 0px 1px 3px rgba(0,0,0,0.25); - -moz-box-shadow: 0px 1px 3px rgba(0,0,0,0.25); - box-shadow: 0px 1px 3px rgba(0,0,0,0.25); - font-family: Chalkboard, 'Comic Sans'; + -webkit-box-shadow: #DDD 0px 1px 2px; + position: relative; + background-color: #F4F39E; + border-color: #DEE184; + text-align: center; + margin: 2.5em 0px; + padding: 1.5em 1em; + -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.25); + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.25); + font-family: Chalkboard, 'Comic Sans'; } + .sticky.taped2:after { - display: block; - content: ""; - position: absolute; - width: 110px; - height: 30px; - top: -21px; - left: 30%; - border: 1px solid #fff; - background: rgba(254, 254, 254, .6); - -webkit-box-shadow: 0px 0 3px rgba(0,0,0,0.1); - -moz-box-shadow: 0px 0 3px rgba(0,0,0,0.1); - box-shadow: 0px 0 3px rgba(0,0,0,0.1); + display: block; + content: ""; + position: absolute; + width: 110px; + height: 30px; + top: -21px; + left: 30%; + border: 1px solid #fff; + background: rgba(254, 254, 254, .6); + -webkit-box-shadow: 0px 0 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0px 0 3px rgba(0, 0, 0, 0.1); + box-shadow: 0px 0 3px rgba(0, 0, 0, 0.1); } /* borrowed from http://designshack.net/articles/css/4-fun-css-image-effects-you-can-copy-and-paste/ */ .picture-frame img { - border: 10px solid #fff; - -webkit-box-shadow: 3px 0px 0px #777; - -moz-box-shadow: 3px 0px 0px #777; - box-shadow: 0px 0px 5px rgba(0,0,0,0.35); + border: 10px solid #fff; + -webkit-box-shadow: 3px 0px 0px #777; + -moz-box-shadow: 3px 0px 0px #777; + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.35); } diff --git a/backend/pkdb_app/statistics.py b/backend/pkdb_app/statistics.py index 7411c2f1..29b1bdfe 100644 --- a/backend/pkdb_app/statistics.py +++ b/backend/pkdb_app/statistics.py @@ -28,6 +28,7 @@ def __init__(self): self.output_calculated_count = Output.objects.filter(normed=True, calculated=True).count() self.timecourse_count = Timecourse.objects.filter(normed=True).count() + @api_view(['GET']) def study_pks_view(request): if request.method == 'GET': @@ -38,6 +39,7 @@ class StatisticsViewSet(viewsets.ViewSet): """ Get database statistics including version. """ + def list(self, request): instance = Statistics() serializer = StatisticsSerializer(instance) @@ -62,5 +64,3 @@ def to_representation(self, instance): "timecourse_count", ] } - - diff --git a/backend/pkdb_app/storage.py b/backend/pkdb_app/storage.py index f087f147..58a61d12 100644 --- a/backend/pkdb_app/storage.py +++ b/backend/pkdb_app/storage.py @@ -7,5 +7,3 @@ def get_available_name(self, name, max_length=None): if os.path.exists(self.path(name)): os.remove(self.path(name)) return name - - diff --git a/backend/pkdb_app/studies/admin.py b/backend/pkdb_app/studies/admin.py index eeace370..5e65538b 100644 --- a/backend/pkdb_app/studies/admin.py +++ b/backend/pkdb_app/studies/admin.py @@ -10,5 +10,5 @@ class ReferenceAdmin(admin.ModelAdmin): @admin.register(Study) class StudyAdmin(admin.ModelAdmin): - fields = ('pk', 'pkdb_version', 'name', 'creator','reference',) + fields = ('pk', 'pkdb_version', 'name', 'creator', 'reference',) list_display = ('pk', 'pkdb_version', 'name', 'creator', 'reference',) diff --git a/backend/pkdb_app/studies/models.py b/backend/pkdb_app/studies/models.py index bbcf4358..71226fac 100644 --- a/backend/pkdb_app/studies/models.py +++ b/backend/pkdb_app/studies/models.py @@ -300,5 +300,3 @@ def delete(self, *args, **kwargs): if self.reference: self.reference.delete() super().delete(*args, **kwargs) - - diff --git a/backend/pkdb_app/studies/serializers.py b/backend/pkdb_app/studies/serializers.py index 72b87914..3c84e0e8 100644 --- a/backend/pkdb_app/studies/serializers.py +++ b/backend/pkdb_app/studies/serializers.py @@ -20,11 +20,12 @@ from ..interventions.serializers import InterventionSetSerializer, InterventionSetElasticSmallSerializer from ..subjects.serializers import GroupSetSerializer, IndividualSetSerializer, DataFileElasticSerializer, \ - GroupSetElasticSmallSerializer, IndividualSetElasticSmallSerializer + GroupSetElasticSmallSerializer, IndividualSetElasticSmallSerializer from ..users.models import User from .models import Reference, Author, Study, Rating from ..serializers import WrongKeyValidationSerializer, SidSerializer + # ---------------------------------- # Study / Reference # ---------------------------------- @@ -63,11 +64,10 @@ class Meta: ) def create(self, validated_data): - #return super().create(validated_data) + # return super().create(validated_data) authors_data = validated_data.pop("authors", []) - reference = Reference.objects.create(**validated_data) update_or_create_multiple(reference, authors_data, "authors") reference.save() @@ -94,14 +94,15 @@ class CuratorRatingSerializer(serializers.ModelSerializer): slug_field="username" ) study = serializers.PrimaryKeyRelatedField(required=False, - queryset=Study.objects.all() - ) + queryset=Study.objects.all() + ) + class Meta: model = Rating - fields = ("rating","user","study") + fields = ("rating", "user", "study") def to_representation(self, instance): - return {"curator":instance.username} + return {"curator": instance.username} class StudySerializer(SidSerializer): @@ -122,8 +123,8 @@ class StudySerializer(SidSerializer): """ reference = utils.SlugRelatedField(slug_field="sid", - queryset=Reference.objects.all(), required=True, allow_null=False - ) + queryset=Reference.objects.all(), required=True, allow_null=False + ) groupset = GroupSetSerializer(read_only=False, required=False, allow_null=True) curators = CuratorRatingSerializer(many=True, required=False, allow_null=True) @@ -142,7 +143,6 @@ class StudySerializer(SidSerializer): allow_null=True, ) - descriptions = DescriptionSerializer( many=True, read_only=False, required=False, allow_null=True ) @@ -181,7 +181,7 @@ class Meta: "files", "comments", ) - write_only_fields = ('curators','collaborators') + write_only_fields = ('curators', 'collaborators') def create(self, validated_data): related = self.pop_relations(validated_data) @@ -193,8 +193,6 @@ def create(self, validated_data): instance.save() return instance - - def update(self, instance, validated_data): # remove nested relations (handled via own serializers) @@ -215,14 +213,14 @@ def to_internal_value(self, data): # curators to internal if "curators" in data: ratings = [] - for curator_and_rating in data.get("curators",[]): + for curator_and_rating in data.get("curators", []): rating_dict = {} if isinstance(curator_and_rating, list): if len(curator_and_rating) != 2: raise serializers.ValidationError( { "curators": " Each curator in the list of curator can be added either via the curator " - "username or as a list with first position beeing the curator username " + "username or as a list with first position beeing the curator username " " and the second posion the rating between (0-5)", "details": curator_and_rating, @@ -237,17 +235,16 @@ def to_internal_value(self, data): ratings.append(rating_dict) data["curators"] = ratings - # check for duplicates ####################################### - for item in ["collaborators","curators","substances"]: + for item in ["collaborators", "curators", "substances"]: if item in ["curators"]: related_unique_field = "user" unique_values = [instance.get(related_unique_field) for instance in data.get(item, [])] else: - unique_values = data.get(item, []) + unique_values = data.get(item, []) duplicates = list_duplicates(unique_values) if duplicates: @@ -258,23 +255,21 @@ def to_internal_value(self, data): if data.get("reference"): reference = Reference.objects.get(sid=data["reference"]) - if hasattr(reference,"study"): + if hasattr(reference, "study"): if str(reference.study.sid) != str(data.get("sid")): - raise serializers.ValidationError( - { - "reference": - f"References are required to be unqiue on every study. " - f"This Reference already exist in study with sid: <{reference.study.sid} and " - f"name: <{reference.study.name}>. If you changed the sid of the study " - f"you might want to run `delete_study -s {reference.study.sid}`. ", - "details": data["reference"], - } - ) + { + "reference": + f"References are required to be unqiue on every study. " + f"This Reference already exist in study with sid: <{reference.study.sid} and " + f"name: <{reference.study.name}>. If you changed the sid of the study " + f"you might want to run `delete_study -s {reference.study.sid}`. ", + "details": data["reference"], + } + ) return super().to_internal_value(data) - def to_representation(self, instance): """ Convert to JSON. @@ -286,17 +281,17 @@ def to_representation(self, instance): request = self.context.get('request') # replace file url - #todo: This is not working correctly + # todo: This is not working correctly if "files" in rep: - rep["files"] = [ request.build_absolute_uri(file.file.url) for file in instance.files.all() ] + rep["files"] = [request.build_absolute_uri(file.file.url) for file in instance.files.all()] curators = [] for user in instance.curators.all(): rating = instance.ratings.get(user=user) - curators.append({"rating":rating.rating, - "first_name":user.first_name, - "last_name":user.last_name, - "pk":user.pk}) + curators.append({"rating": rating.rating, + "first_name": user.first_name, + "last_name": user.last_name, + "pk": user.pk}) rep["curators"] = curators @@ -327,13 +322,14 @@ def pop_relations(self, validated_data): "descriptions": Description, "comments": Comment, "curators": User, - "collaborators":User, + "collaborators": User, "files": DataFile, } related_foreinkeys_dict = { name: validated_data.pop(name, None) for name in related_foreinkeys.keys() } - related_many2many_dict = {name: validated_data.pop(name) for name in related_many2many.keys() if name in validated_data} + related_many2many_dict = {name: validated_data.pop(name) for name in related_many2many.keys() if + name in validated_data} related = {**related_foreinkeys_dict, **related_many2many_dict} return related @@ -376,7 +372,6 @@ def create_relations(self, study, related): if related["comments"]: create_multiple(study, related["comments"], "comments") - if "files" in related: study.files.clear() @@ -405,10 +400,10 @@ class CuratorRatingElasticSerializer(serializers.Serializer): username = serializers.CharField() class Meta: - fields = ("id", "first_name", "last_name","username","rating") + fields = ("id", "first_name", "last_name", "username", "rating") -class StudySmallElasticSerializer(serializers.HyperlinkedModelSerializer): +class StudySmallElasticSerializer(serializers.HyperlinkedModelSerializer): licence = serializers.CharField(read_only=True) curators = CuratorRatingElasticSerializer(many=True, read_only=True) creator = UserElasticSerializer(read_only=True) @@ -416,15 +411,14 @@ class StudySmallElasticSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Study - fields = ["pk","sid","name","licence","curators","collaborators","creator"] - - + fields = ["pk", "sid", "name", "licence", "curators", "collaborators", "creator"] class ReferenceElasticSerializer(serializers.HyperlinkedModelSerializer): authors = AuthorElasticSerializer(many=True, read_only=True) pdf = serializers.SerializerMethodField() study = StudySmallElasticSerializer() + class Meta: model = Reference fields = ( @@ -444,13 +438,11 @@ class Meta: def get_pdf(self, obj): user = self.context["request"].user - if get_study_file_permission(user,AttrDict(obj.study)): + if get_study_file_permission(user, AttrDict(obj.study)): return obj.to_dict().get("pdf") else: return None - - def to_representation(self, instance): """ Convert to JSON. @@ -468,11 +460,9 @@ def to_representation(self, instance): class ReferenceSmallElasticSerializer(serializers.HyperlinkedModelSerializer): - #url = serializers.HyperlinkedIdentityField(read_only=True, lookup_field="id",view_name="references_elastic-detail") class Meta: model = Reference - fields = ["sid"]#, 'url'] - + fields = ["sid"] # , 'url'] class StudyElasticSerializer(serializers.HyperlinkedModelSerializer): pk = serializers.CharField() @@ -483,14 +473,13 @@ class StudyElasticSerializer(serializers.HyperlinkedModelSerializer): licence = serializers.CharField(read_only=True) access = serializers.CharField(read_only=True) - curators = CuratorRatingElasticSerializer(many=True, read_only=True) creator = UserElasticSerializer(read_only=True) collaborators = UserElasticSerializer(many=True, read_only=True) substances = serializers.SerializerMethodField() - files = serializers.SerializerMethodField()#DataFileElasticSerializer(many=True, read_only=True) + files = serializers.SerializerMethodField() # DataFileElasticSerializer(many=True, read_only=True) comments = CommentElasticSerializer(many=True, read_only=True) descriptions = DescriptionElasticSerializer(many=True, read_only=True) @@ -527,21 +516,21 @@ class Meta: "output_count", "output_calculated_count", "timecourse_count" - ] + ] read_only_fields = fields - def get_substances(self, obj): + @staticmethod + def get_substances(obj): """Get substances.""" if obj.substances: return list(obj.substances) else: return [] - def get_files(self, obj): - if get_study_file_permission(self.context["request"].user,obj): + if get_study_file_permission(self.context["request"].user, obj): files_serializer = DataFileElasticSerializer(obj.files, many=True, read_only=True) return files_serializer.data diff --git a/backend/pkdb_app/studies/views.py b/backend/pkdb_app/studies/views.py index 1c51dc0c..d6755579 100644 --- a/backend/pkdb_app/studies/views.py +++ b/backend/pkdb_app/studies/views.py @@ -69,7 +69,7 @@ class StudyViewSet(viewsets.ModelViewSet): def get_queryset(self): queryset = super().get_queryset() group = user_group(self.request.user) - if group in ["admin","reviewer"]: + if group in ["admin", "reviewer"]: return queryset elif group == "basic": @@ -82,22 +82,21 @@ def get_queryset(self): elif group == "anonymous": return queryset.filter(access=PUBLIC) - @staticmethod def group_validation(request): if "groupset" in request.data and request.data["groupset"]: groupset = request.data["groupset"] if "groups" in groupset: groups = groupset.get("groups", []) - if not isinstance(groups,list): + if not isinstance(groups, list): raise ValidationError( - {"groups": f"groups must be a list and not a {type(groups)}","detail":groups}) + {"groups": f"groups must be a list and not a {type(groups)}", "detail": groups}) parents_name = set() groups_name = set() for group in groups: - parent_name = group.get("parent") + parent_name = group.get("parent") if parent_name: parents_name.add(parent_name) group_name = group.get("name") @@ -107,7 +106,8 @@ def group_validation(request): raise ValidationError({"groups": "parent is not allowed for group all"}) elif group_name != "all" and parent_name is None: - raise ValidationError({"groups":"parent is required for keyword in groups besides for the group"}) + raise ValidationError( + {"groups": "parent is required for keyword in groups besides for the group"}) if "all" not in groups_name: raise ValidationError( @@ -117,10 +117,9 @@ def group_validation(request): "characteristica for all groups and individuals. Species information are requirement " "on the all group. Create the `all` group or rename group to `all`. " - } + } ) - # validate if groups are missing missing_groups = parents_name - groups_name if missing_groups: @@ -149,7 +148,7 @@ def destroy(self, request, *args, **kwargs): related_elastic = related_elastic_dict(instance) delete_elastic_study(related_elastic) - return super().destroy(request,*args, **kwargs) + return super().destroy(request, *args, **kwargs) ############################################################################################### @@ -158,7 +157,6 @@ def destroy(self, request, *args, **kwargs): @csrf_exempt def update_index_study(request): - if request.method == 'POST': data = JSONParser().parse(request) try: @@ -185,7 +183,6 @@ def delete_elastic_study(related_elastic): pass - def related_elastic_dict(study): """ Dictionary of elastic documents for given study. @@ -210,7 +207,6 @@ def related_elastic_dict(study): OutputDocument: study.outputs, TimecourseDocument: study.timecourses, - } if study.reference: docs_dict[ReferenceDocument] = study.reference @@ -223,7 +219,7 @@ class ElasticStudyViewSet(DocumentViewSet): document = StudyDocument pagination_class = CustomPagination serializer_class = StudyElasticSerializer - filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend] + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] permission_classes = (StudyPermission,) search_fields = ( 'sid', @@ -247,7 +243,7 @@ class ElasticStudyViewSet(DocumentViewSet): } filter_fields = { - 'sid':'sid.raw', + 'sid': 'sid.raw', 'name': 'name.raw', 'licence': 'licence.raw', 'access': 'access.raw', @@ -256,7 +252,7 @@ class ElasticStudyViewSet(DocumentViewSet): ordering_fields = { 'sid': 'sid', } - + def get_object(self): """Get object.""" queryset = self.get_queryset() @@ -298,7 +294,7 @@ def get_queryset(self): search = self.search group = user_group(self.request.user) - if group in ["admin","reviewer"]: + if group in ["admin", "reviewer"]: return search.query() elif group == "basic": @@ -323,7 +319,6 @@ def get_queryset(self): return qs - class ElasticReferenceViewSet(DocumentViewSet): """Read/query/search references. """ document_uid_field = "sid__raw" @@ -333,12 +328,12 @@ class ElasticReferenceViewSet(DocumentViewSet): permission_classes = (IsAdminOrCreatorOrCurator,) serializer_class = ReferenceElasticSerializer filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] - search_fields = ('sid','study_name','study_pk','pmid','title','abstract','name','journal') + search_fields = ('sid', 'study_name', 'study_pk', 'pmid', 'title', 'abstract', 'name', 'journal') multi_match_search_fields = {field: {"boost": 1} for field in search_fields} multi_match_options = { 'operator': 'and' } - filter_fields = {'name': 'name.raw',} + filter_fields = {'name': 'name.raw', } ordering_fields = { 'sid': 'sid', "pk": 'pk', diff --git a/backend/pkdb_app/subjects/documents.py b/backend/pkdb_app/subjects/documents.py index 91169a69..c7efc0b1 100644 --- a/backend/pkdb_app/subjects/documents.py +++ b/backend/pkdb_app/subjects/documents.py @@ -5,7 +5,6 @@ from pkdb_app.interventions.documents import string_field, ObjectField from ..documents import elastic_settings - html_strip = analyzer( 'html_strip', tokenizer="standard", @@ -14,24 +13,24 @@ ) characteristica_object_field = fields.ObjectField( - properties={ - 'pk': fields.IntegerField(), - 'measurement_type': string_field('measurement_type_name'), - 'substance': string_field('substance_name'), - 'choice': string_field('choice'), - 'value': fields.FloatField('value'), - 'mean': fields.FloatField(), - 'median': fields.FloatField(), - 'min': fields.FloatField(), - 'max': fields.FloatField(), - 'se': fields.FloatField(), - 'sd': fields.FloatField(), - 'cv': fields.FloatField(), - 'unit': string_field('unit'), - 'count': fields.IntegerField('count'), - }, - multi=True - ) + properties={ + 'pk': fields.IntegerField(), + 'measurement_type': string_field('measurement_type_name'), + 'substance': string_field('substance_name'), + 'choice': string_field('choice'), + 'value': fields.FloatField('value'), + 'mean': fields.FloatField(), + 'median': fields.FloatField(), + 'min': fields.FloatField(), + 'max': fields.FloatField(), + 'se': fields.FloatField(), + 'sd': fields.FloatField(), + 'cv': fields.FloatField(), + 'unit': string_field('unit'), + 'count': fields.IntegerField('count'), + }, + multi=True +) # ------------------------------------ @@ -120,7 +119,7 @@ class Index: def get_queryset(self): """Not mandatory but to improve performance we can select related in one sql request""" return super(GroupDocument, self).get_queryset().select_related( - 'ex__groupset__study','parent').prefetch_related("characteristica") + 'ex__groupset__study', 'parent').prefetch_related("characteristica") # ------------------------------------ @@ -148,7 +147,7 @@ class CharacteristicaDocument(Document): group_parent_pk = fields.IntegerField( attr='group_parent_pk', ) - #individual_related + # individual_related individual_name = fields.StringField( attr='individual_name', fields={ @@ -213,11 +212,12 @@ class Index: name = "characteristica" settings = {**elastic_settings, 'max_result_window': 50000} - def get_queryset(self): """Not mandatory but to improve performance we can select related in one sql request""" return super(CharacteristicaDocument, self).get_queryset().select_related( - 'group','individual') + 'group', 'individual') + + # Elastic Characteristica Document # ------------------------------------ @@ -228,7 +228,6 @@ class GroupCharacteristicaDocument(Document): study_sid = string_field('study_sid') study_name = string_field('study_name') - # group related group_pk = fields.IntegerField(attr='group_pk') group_name = fields.StringField( @@ -297,11 +296,11 @@ class Index: name = "group_characteristica" settings = {**elastic_settings, 'max_result_window': 50000} - def get_queryset(self): """Not mandatory but to improve performance we can select related in one sql request""" return super(GroupCharacteristicaDocument, self).get_queryset().select_related( - 'group','characteristica') + 'group', 'characteristica') + @registry.register_document class IndividualCharacteristicaDocument(Document): @@ -309,7 +308,6 @@ class IndividualCharacteristicaDocument(Document): study_sid = string_field('study_sid') study_name = string_field('study_name') - # individual related individual_pk = fields.IntegerField(attr='individual_pk') individual_name = fields.StringField( @@ -377,8 +375,7 @@ class Index: name = "individual_characteristica" settings = {**elastic_settings, 'max_result_window': 50000} - def get_queryset(self): """Not mandatory but to improve performance we can select related in one sql request""" return super(IndividualCharacteristicaDocument, self).get_queryset().select_related( - 'individual','characteristica') + 'individual', 'characteristica') diff --git a/backend/pkdb_app/subjects/managers.py b/backend/pkdb_app/subjects/managers.py index 3a97f834..44f0e498 100644 --- a/backend/pkdb_app/subjects/managers.py +++ b/backend/pkdb_app/subjects/managers.py @@ -17,8 +17,6 @@ def create(self, *args, **kwargs): create_multiple(groupset, descriptions, "descriptions") create_multiple(groupset, comments, "comments") - - study_group_exs = [] for group_ex in group_exs: if "parent_ex" in group_ex: @@ -40,7 +38,6 @@ def create(self, *args, **kwargs): for group in groupset.groups: group.characteristica_all_normed.add(*group._characteristica_all_normed) - return groupset @@ -89,19 +86,16 @@ def create(self, *args, **kwargs): Characteristica = apps.get_model('subjects', 'Characteristica') for characteristica_single in characteristica: - characteristica_single["count"] = characteristica_single.get( "count", group.count) + characteristica_single["count"] = characteristica_single.get("count", group.count) characteristica_updated.append(characteristica_single) - not_norm_group = create_multiple_bulk(group, "group", characteristica_updated, Characteristica) create_multiple_bulk_normalized(not_norm_group, Characteristica) - group.save() return group - class CharacteristicaExManager(models.Manager): def create(self, *args, **kwargs): comments = kwargs.pop("comments", []) @@ -124,46 +118,43 @@ def create(self, *args, **kwargs): kwargs.pop("study") comments = kwargs.pop("comments", []) - Comment = apps.get_model('comments','Comment') - Description = apps.get_model('comments','Description') - + Comment = apps.get_model('comments', 'Comment') + Description = apps.get_model('comments', 'Description') individualset = super().create(*args, **kwargs) - #create_multiple(individualset, descriptions, "descriptions") - #create_multiple_bulk(individualset,"individualset", individual_exs, IndividualEx) + # create_multiple(individualset, descriptions, "descriptions") + # create_multiple_bulk(individualset,"individualset", individual_exs, IndividualEx) create_multiple(individualset, individual_exs, "individual_exs") - create_multiple_bulk(individualset,"individualset", descriptions, Description) - create_multiple_bulk(individualset,"individualset", comments, Comment) + create_multiple_bulk(individualset, "individualset", descriptions, Description) + create_multiple_bulk(individualset, "individualset", comments, Comment) individualset.save() # add characteristica from parents to the all_characteristica_normed if each individual for individual in individualset.individuals: - #print(individual._characteristica_all_normed.all()) + # print(individual._characteristica_all_normed.all()) individual.characteristica_all_normed.add(*individual._characteristica_all_normed) return individualset class IndividualExManager(models.Manager): def create(self, *args, **kwargs): - characteristica_ex = kwargs.pop("characteristica_ex", []) individuals = kwargs.pop("individuals", []) comments = kwargs.pop("comments", []) descriptions = kwargs.pop("descriptions", []) - comment_model = apps.get_model('comments','Comment') - description_model = apps.get_model('comments','Description') + comment_model = apps.get_model('comments', 'Comment') + description_model = apps.get_model('comments', 'Description') individual_ex = super().create(*args, **kwargs) create_multiple(individual_ex, characteristica_ex, "characteristica_ex") create_multiple(individual_ex, individuals, "individuals") - #create_multiple(individual_ex, comments, "comments") - create_multiple_bulk(individual_ex,"ex", comments, comment_model) - create_multiple_bulk(individual_ex,"ex", descriptions, description_model) - + # create_multiple(individual_ex, comments, "comments") + create_multiple_bulk(individual_ex, "ex", comments, comment_model) + create_multiple_bulk(individual_ex, "ex", descriptions, description_model) individual_ex.save() return individual_ex @@ -173,8 +164,8 @@ class IndividualManager(models.Manager): def create(self, *args, **kwargs): characteristica = kwargs.pop("characteristica", []) individual = super().create(*args, **kwargs) - Characteristica = apps.get_model('subjects','Characteristica') - not_norm_individual = create_multiple_bulk(individual,"individual", characteristica, Characteristica) - create_multiple_bulk_normalized(not_norm_individual,Characteristica) + Characteristica = apps.get_model('subjects', 'Characteristica') + not_norm_individual = create_multiple_bulk(individual, "individual", characteristica, Characteristica) + create_multiple_bulk_normalized(not_norm_individual, Characteristica) individual.save() return individual diff --git a/backend/pkdb_app/subjects/models.py b/backend/pkdb_app/subjects/models.py index 3b00e033..e2b91151 100644 --- a/backend/pkdb_app/subjects/models.py +++ b/backend/pkdb_app/subjects/models.py @@ -31,6 +31,7 @@ ADDITIVE_CHARACTERISTICA = ["disease", "abstinence"] + # ---------------------------------- # DataFile # ---------------------------------- @@ -66,7 +67,6 @@ def __str__(self): # ---------------------------------- - class GroupSet(models.Model): objects = GroupSetManager() @@ -75,7 +75,6 @@ def groups(self): groups = Group.objects.filter(ex__in=self.group_exs.all()) return groups - @property def count(self): if self.groups: @@ -141,18 +140,17 @@ class Group(Accessible): name = models.CharField(max_length=CHAR_MAX_LENGTH) count = models.IntegerField() parent = models.ForeignKey("Group", null=True, on_delete=models.CASCADE) - characteristica_all_normed = models.ManyToManyField("Characteristica",related_name="groups", through="GroupCharacteristica") + characteristica_all_normed = models.ManyToManyField("Characteristica", related_name="groups", + through="GroupCharacteristica") objects = GroupManager() # class Meta: # todo: in validator unique_together = ('ex__groupset', 'name') - @property def study(self): return self.ex.groupset.study - @property def source(self): return self.ex.source @@ -171,9 +169,11 @@ def parents(self): @property def _characteristica_all(self): _characteristica_all = self.characteristica.all() - this_measurements = _characteristica_all.exclude(measurement_type__name__in=ADDITIVE_CHARACTERISTICA).values_list("measurement_type", flat=True) + this_measurements = _characteristica_all.exclude( + measurement_type__name__in=ADDITIVE_CHARACTERISTICA).values_list("measurement_type", flat=True) if self.parent: - _characteristica_all = _characteristica_all | self.parent._characteristica_all.exclude(measurement_type__in=this_measurements) + _characteristica_all = _characteristica_all | self.parent._characteristica_all.exclude( + measurement_type__in=this_measurements) return _characteristica_all @property @@ -192,7 +192,6 @@ def individuals(self): individuals = Individual.objects.filter(ex__in=self.individual_exs.all()) return individuals - @property def count(self): if self.individuals: @@ -215,7 +214,7 @@ class IndividualEx(Externable, AbstractIndividual): Individuals are defined via their characteristics, analogue to groups. """ - source = models.ForeignKey( DataFile, related_name="s_individual_exs", null=True, on_delete=models.SET_NULL) + source = models.ForeignKey(DataFile, related_name="s_individual_exs", null=True, on_delete=models.SET_NULL) figure = models.ForeignKey(DataFile, related_name="f_individual_exs", null=True, on_delete=models.SET_NULL) individualset = models.ForeignKey(IndividualSet, on_delete=models.CASCADE, related_name="individual_exs") group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name="individual_exs", null=True) @@ -223,7 +222,6 @@ class IndividualEx(Externable, AbstractIndividual): name = models.CharField(max_length=CHAR_MAX_LENGTH, null=True) name_map = models.CharField(max_length=CHAR_MAX_LENGTH_LONG, null=True) - objects = IndividualExManager() class Meta: @@ -254,7 +252,8 @@ class Individual(AbstractIndividual, Accessible): Group, on_delete=models.CASCADE, related_name="individuals" ) name = models.CharField(max_length=CHAR_MAX_LENGTH) - characteristica_all_normed = models.ManyToManyField("Characteristica",related_name="individuals", through="IndividualCharacteristica") + characteristica_all_normed = models.ManyToManyField("Characteristica", related_name="individuals", + through="IndividualCharacteristica") objects = IndividualManager() @property @@ -269,15 +268,16 @@ def figure(self): def _characteristica_normed(self): return self.characteristica.filter(normed=True) - @property def _characteristica_all_normed(self): _characteristica_normed = self._characteristica_normed # charcteristica from related groups with the same measurement type as these used in the individual are excluded. - #this_measurements = characteristica_normed.values_list("measurement_type", flat=True) - this_measurements = _characteristica_normed.exclude(measurement_type__name__in=ADDITIVE_CHARACTERISTICA).values_list("measurement_type", flat=True) - return (_characteristica_normed | self.group._characteristica_all_normed.exclude(measurement_type__in=this_measurements)) + # this_measurements = characteristica_normed.values_list("measurement_type", flat=True) + this_measurements = _characteristica_normed.exclude( + measurement_type__name__in=ADDITIVE_CHARACTERISTICA).values_list("measurement_type", flat=True) + return (_characteristica_normed | self.group._characteristica_all_normed.exclude( + measurement_type__in=this_measurements)) @property def study(self): @@ -293,7 +293,8 @@ def characteristica_measurements(self): @property def characteristica_choices(self): - return {characteristica.measurement_type: characteristica.choice for characteristica in self.characteristica_all_normed.all()} + return {characteristica.measurement_type: characteristica.choice for characteristica in + self.characteristica_all_normed.all()} # ---------------------------------- @@ -301,7 +302,6 @@ def characteristica_choices(self): # ---------------------------------- class AbstractCharacteristica(models.Model): - count = models.IntegerField(null=True) class Meta: @@ -341,6 +341,7 @@ class CharacteristicaEx( ) objects = CharacteristicaExManager() + class Characteristica(Accessible, Normalizable, AbstractCharacteristica): """ Characteristic. """ @@ -424,7 +425,6 @@ def individual_group_pk(self): class SubjectCharacteristica(models.Model): - class Meta: abstract = True @@ -432,7 +432,6 @@ class Meta: def characteristica_pk(self): return self.characteristica.pk - @property def raw_pk(self): return self.characteristica.raw_pk @@ -449,7 +448,6 @@ def count(self): def measurement_type(self): return self.characteristica.measurement_type.name - @property def choice(self): return self.characteristica.choice @@ -496,12 +494,10 @@ def cv(self): return self.characteristica.cv - -class GroupCharacteristica(Accessible,SubjectCharacteristica): +class GroupCharacteristica(Accessible, SubjectCharacteristica): characteristica = models.ForeignKey(Characteristica, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) - class Meta: unique_together = ("characteristica", "group") @@ -527,11 +523,7 @@ def group_count(self): return self.group.count - - - - -class IndividualCharacteristica(Accessible,SubjectCharacteristica): +class IndividualCharacteristica(Accessible, SubjectCharacteristica): characteristica = models.ForeignKey(Characteristica, on_delete=models.CASCADE) individual = models.ForeignKey(Individual, on_delete=models.CASCADE) @@ -553,5 +545,3 @@ def individual_name(self): @property def individual_group_pk(self): return self.individual.group.pk - - diff --git a/backend/pkdb_app/subjects/serializers.py b/backend/pkdb_app/subjects/serializers.py index b673ad85..159724f8 100644 --- a/backend/pkdb_app/subjects/serializers.py +++ b/backend/pkdb_app/subjects/serializers.py @@ -1,6 +1,6 @@ from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.db.models import Q -from pkdb_app.categorials.behaviours import map_field, VALUE_FIELDS_NO_UNIT, \ +from pkdb_app.categorials.behaviours import map_field, VALUE_FIELDS_NO_UNIT, \ MEASUREMENTTYPE_FIELDS, EX_MEASUREMENTTYPE_FIELDS from pkdb_app.categorials.serializers import MeasurementTypeableSerializer, EXMeasurementTypeableSerializer from rest_framework import serializers @@ -33,10 +33,10 @@ GROUP_FIELDS = ["name", "count"] GROUP_MAP_FIELDS = ["name_map", "count_map"] -EXTERN_FILE_FIELDS = ["source", "subset_map","groupby", "figure", "source_map", "figure_map"] +EXTERN_FILE_FIELDS = ["source", "subset_map", "groupby", "figure", "source_map", "figure_map"] -#todo: move datafile from subjects module +# todo: move datafile from subjects module # ---------------------------------- # DataFile # ---------------------------------- @@ -64,17 +64,15 @@ class CharacteristicaExSerializer(EXMeasurementTypeableSerializer): many=True, read_only=False, required=False, allow_null=True ) - class Meta: model = CharacteristicaEx fields = ( - CHARACTERISTISTA_FIELDS - + CHARACTERISTISTA_MAP_FIELDS - + EX_MEASUREMENTTYPE_FIELDS - + ["comments","descriptions"] + CHARACTERISTISTA_FIELDS + + CHARACTERISTISTA_MAP_FIELDS + + EX_MEASUREMENTTYPE_FIELDS + + ["comments", "descriptions"] ) - def to_internal_value(self, data): data = super().to_internal_value(data) self.validate_wrong_keys(data) @@ -96,9 +94,9 @@ class Meta: def to_internal_value(self, data): data.pop("comments", None) data.pop("descriptions", None) - self._is_required(data,"measurement_type") + self._is_required(data, "measurement_type") self.validate_wrong_keys(data) - return super(serializers.ModelSerializer,self).to_internal_value(data) + return super(serializers.ModelSerializer, self).to_internal_value(data) def validate(self, attrs): try: @@ -129,9 +127,9 @@ def to_internal_value(self, data): data = self.retransform_map_fields(data) data = self.retransform_ex_fields(data) self.validate_wrong_keys(data) - _validate_requried_key(data,"count") + _validate_requried_key(data, "count") - for characteristica_single in data.get("characteristica",[]): + for characteristica_single in data.get("characteristica", []): disabled = ["value"] self._validate_disabled_data(characteristica_single, disabled) @@ -143,11 +141,13 @@ def validate(self, attrs): :return: """ if attrs.get("name") == "all": - is_species = [characteristica_single.get("measurement_type").name == "species" for characteristica_single in attrs.get("characteristica", [])] + is_species = [characteristica_single.get("measurement_type").name == "species" for characteristica_single in + attrs.get("characteristica", [])] if not any(is_species): raise serializers.ValidationError( - {"characteristica": "A characteristica with `'measurement_type' = 'species'` is required on the `all` group.", - "details":attrs}) + { + "characteristica": "A characteristica with `'measurement_type' = 'species'` is required on the `all` group.", + "details": attrs}) return super().validate(attrs) def to_representation(self, instance): @@ -181,10 +181,10 @@ class GroupExSerializer(ExSerializer): class Meta: model = GroupEx fields = ( - EXTERN_FILE_FIELDS - + GROUP_FIELDS - + GROUP_MAP_FIELDS - + ["parent_ex", "characteristica_ex", "groups", "comments", "descriptions"] + EXTERN_FILE_FIELDS + + GROUP_FIELDS + + GROUP_MAP_FIELDS + + ["parent_ex", "characteristica_ex", "groups", "comments", "descriptions"] ) def to_internal_value(self, data): @@ -210,7 +210,6 @@ def to_internal_value(self, data): data = self.transform_ex_fields(data) data = self.transform_map_fields(data) - data["groups"] = groups # ---------------------------------- @@ -224,6 +223,7 @@ def to_representation(self, instance): rep = super().to_representation(instance) return rep + class GroupSetSerializer(ExSerializer): descriptions = DescriptionSerializer( many=True, read_only=False, required=False, allow_null=True @@ -280,29 +280,24 @@ def group_to_internal_value(group, study_sid): return group def to_internal_value(self, data): - self._is_required(data,"group") + self._is_required(data, "group") data.pop("comments", None) data.pop("descriptions", None) study_sid = self.context["request"].path.split("/")[-2] if "group" in data: data["group"] = self.group_to_internal_value(data["group"], study_sid) - - - data = self.retransform_map_fields(data) data = self.retransform_ex_fields(data) self.validate_wrong_keys(data) - for characteristica_single in data.get("characteristica",[]): + for characteristica_single in data.get("characteristica", []): disabled = ["mean", "median", "sd", "se", "cv"] self._validate_disabled_data(characteristica_single, disabled) - return super(serializers.ModelSerializer, self).to_internal_value(data) - class IndividualExSerializer(ExSerializer): characteristica_ex = CharacteristicaExSerializer( many=True, read_only=False, required=False, allow_null=True @@ -360,8 +355,6 @@ def to_internal_value(self, data): # decompress external format # ---------------------------------- - - temp_individuals = self.split_entry(data) individuals = [] for individual in temp_individuals: @@ -411,7 +404,6 @@ def to_representation(self, instance): class IndividualSetSerializer(ExSerializer): - individual_exs = IndividualExSerializer(many=True, read_only=False, required=False) descriptions = DescriptionSerializer( many=True, read_only=False, required=False, allow_null=True @@ -440,18 +432,24 @@ class CharacteristicaElasticBigSerializer(ReadSerializer): class Meta: model = Characteristica - fields = ["pk","raw_pk","normed","study_sid","study_name","subject_type"] + CHARACTERISTISTA_FIELDS + MEASUREMENTTYPE_FIELDS + ["group_pk","group_name","group_count","group_parent_pk"] +["individual_pk","individual_name","individual_group_pk"] + fields = ["pk", "raw_pk", "normed", "study_sid", "study_name", + "subject_type"] + CHARACTERISTISTA_FIELDS + MEASUREMENTTYPE_FIELDS + ["group_pk", "group_name", + "group_count", + "group_parent_pk"] + [ + "individual_pk", "individual_name", "individual_group_pk"] + ############################################################################################### # Elastic Search Serializer ############################################################################################### -#maybe depreciated +# maybe depreciated class DataFileElasticSerializer(serializers.ModelSerializer): file = serializers.CharField() timecourses = serializers.SerializerMethodField() + class Meta: model = DataFile - fields = ["pk", "name","file", "timecourses"] + fields = ["pk", "name", "file", "timecourses"] def get_timecourses(self, obj): return list_of_pk("timecourses", obj) @@ -469,18 +467,17 @@ class CharacteristicaElasticSerializer(serializers.ModelSerializer): measurement_type = serializers.CharField() substance = serializers.CharField(allow_null=True) - class Meta: model = Characteristica - fields = ["pk"] + CHARACTERISTISTA_FIELDS + MEASUREMENTTYPE_FIELDS + ["normed"]# + ["access","allowed_users"] + fields = ["pk"] + CHARACTERISTISTA_FIELDS + MEASUREMENTTYPE_FIELDS + ["normed"] # + ["access","allowed_users"] def to_representation(self, instance): rep = super().to_representation(instance) for field in VALUE_FIELDS_NO_UNIT: - try: - rep[field] = '{:.2e}'.format(rep[field]) - except (ValueError, TypeError): - pass + try: + rep[field] = '{:.2e}'.format(rep[field]) + except (ValueError, TypeError): + pass return rep @@ -488,7 +485,7 @@ def to_representation(self, instance): class StudySmallElasticSerializer(serializers.ModelSerializer): class Meta: model = Study - fields = ["pk",'name']#,'url'] + fields = ["pk", 'name'] # ,'url'] # Group related Serializer @@ -512,7 +509,7 @@ class Meta: class GroupElasticSerializer(serializers.ModelSerializer): - #study = StudySmallElasticSerializer(read_only=True) + # study = StudySmallElasticSerializer(read_only=True) parent = GroupSmallElasticSerializer(read_only=True) characteristica_all_normed = serializers.SerializerMethodField() allowed_users = UserElasticSerializer(many=True, read_only=True) @@ -544,6 +541,7 @@ class Meta: model = Individual fields = ["pk", 'name'] + class IndividualSetElasticSmallSerializer(serializers.HyperlinkedModelSerializer): descriptions = DescriptionElasticSerializer(many=True, read_only=True) comments = CommentElasticSerializer(many=True, read_only=True) @@ -551,14 +549,14 @@ class IndividualSetElasticSmallSerializer(serializers.HyperlinkedModelSerializer class Meta: model = IndividualSet - fields = ["pk","descriptions", "individuals","comments"] + fields = ["pk", "descriptions", "individuals", "comments"] - def get_individuals(self,obj): + def get_individuals(self, obj): return list_of_pk("individuals", obj) class IndividualElasticSerializer(serializers.ModelSerializer): - #study = StudySmallElasticSerializer(read_only=True) + # study = StudySmallElasticSerializer(read_only=True) group = GroupSmallElasticSerializer(read_only=True) characteristica_all_normed = CharacteristicaElasticSerializer(many=True, read_only=True) allowed_users = UserElasticSerializer(many=True, read_only=True) @@ -577,15 +575,18 @@ class Meta: def get_characteristica_all_normed(self, instance): characteristica = sorted(instance.characteristica_all_normed, key=itemgetter('count')) - return CharacteristicaElasticSerializer(characteristica,many=True, read_only=True).data + return CharacteristicaElasticSerializer(characteristica, many=True, read_only=True).data class GroupCharacteristicaSerializer(serializers.ModelSerializer): class Meta: model = GroupCharacteristica - fields = ["study_sid","study_name","group_pk","group_name","group_count","group_parent_pk","characteristica_pk", "count"] + MEASUREMENTTYPE_FIELDS + fields = ["study_sid", "study_name", "group_pk", "group_name", "group_count", "group_parent_pk", + "characteristica_pk", "count"] + MEASUREMENTTYPE_FIELDS + class IndividualCharacteristicaSerializer(serializers.ModelSerializer): class Meta: model = IndividualCharacteristica - fields = ["study_sid" ,"study_name", "individual_pk","individual_name", "individual_group_pk","characteristica_pk","count"] + MEASUREMENTTYPE_FIELDS \ No newline at end of file + fields = ["study_sid", "study_name", "individual_pk", "individual_name", "individual_group_pk", + "characteristica_pk", "count"] + MEASUREMENTTYPE_FIELDS diff --git a/backend/pkdb_app/subjects/views.py b/backend/pkdb_app/subjects/views.py index 994bcaa1..ebe956e6 100644 --- a/backend/pkdb_app/subjects/views.py +++ b/backend/pkdb_app/subjects/views.py @@ -18,7 +18,7 @@ from pkdb_app.subjects.documents import IndividualDocument, CharacteristicaDocument, GroupDocument, \ GroupCharacteristicaDocument, IndividualCharacteristicaDocument ############################################################ -#Elastic Search Views +# Elastic Search Views ########################################################### from django_elasticsearch_dsl_drf.filter_backends import ( FilteringFilterBackend, @@ -26,20 +26,16 @@ CompoundSearchFilterBackend, IdsFilterBackend, MultiMatchSearchFilterBackend) - from pkdb_app.documents import AccessView - - class GroupViewSet(AccessView): document = GroupDocument serializer_class = GroupElasticSerializer lookup_field = 'id' - filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend] + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] pagination_class = CustomPagination - # Define search fields search_fields = ( 'name', @@ -63,28 +59,26 @@ class GroupViewSet(AccessView): 'name': 'name.raw', 'parent': 'group.name.raw', 'study': 'study.raw', - 'ctype':'ctype.raw' + 'ctype': 'ctype.raw' } # Define ordering fields ordering_fields = { - 'id':'id', + 'id': 'id', 'study': 'study.raw', - #'group': 'group.raw', + # 'group': 'group.raw', 'name': 'name.raw', } class IndividualViewSet(AccessView): - document = IndividualDocument serializer_class = IndividualElasticSerializer lookup_field = 'id' - filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend] + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] pagination_class = CustomPagination - # Define search fields search_fields = ( 'name', @@ -111,20 +105,19 @@ class IndividualViewSet(AccessView): # Define ordering fields ordering_fields = { - 'id':'id', + 'id': 'id', 'study': 'study.raw', 'group': 'group.raw', 'name': 'name.raw', } - class CharacteristicaElasticViewSet(AccessView): pagination_class = CustomPagination document = GroupCharacteristica serializer_class = CharacteristicaElasticBigSerializer lookup_field = 'id' - filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend] + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend] search_fields = ( 'choice', @@ -144,11 +137,11 @@ class CharacteristicaElasticViewSet(AccessView): 'mean': 'mean', 'median': 'median', 'min': 'min', - 'max':'max', - 'se': 'se', - 'sd': 'sd', - 'cv':'cv', - 'normed':'normed', + 'max': 'max', + 'se': 'se', + 'sd': 'sd', + 'cv': 'cv', + 'normed': 'normed', 'group_name': 'group_name.raw', 'group_pk': 'group_pk', @@ -157,6 +150,8 @@ class CharacteristicaElasticViewSet(AccessView): 'study_sid': 'study_sid', } + + class GroupCharacteristicaViewSet(AccessView): document = GroupCharacteristicaDocument serializer_class = GroupCharacteristicaSerializer @@ -172,7 +167,6 @@ class GroupCharacteristicaViewSet(AccessView): 'operator': 'and' } - filter_fields = { 'study_sid': {'field': 'study_sid.raw', @@ -190,12 +184,12 @@ class GroupCharacteristicaViewSet(AccessView): ], }, 'group_name': {'field': 'group_name', - 'lookups': [ - LOOKUP_QUERY_IN, - LOOKUP_QUERY_EXCLUDE, + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, - ], - }, + ], + }, 'group_pk': {'field': 'group_pk', 'lookups': [ @@ -205,19 +199,19 @@ class GroupCharacteristicaViewSet(AccessView): ], }, 'group_parent_pk': {'field': 'group_parent_pk', - 'lookups': [ - LOOKUP_QUERY_IN, - LOOKUP_QUERY_EXCLUDE, - - ], - }, - 'characteristica_pk': {'field': 'characteristica_pk', 'lookups': [ LOOKUP_QUERY_IN, LOOKUP_QUERY_EXCLUDE, ], }, + 'characteristica_pk': {'field': 'characteristica_pk', + 'lookups': [ + LOOKUP_QUERY_IN, + LOOKUP_QUERY_EXCLUDE, + + ], + }, 'group_count': 'group_count', 'count': 'count', @@ -232,13 +226,12 @@ class GroupCharacteristicaViewSet(AccessView): 'se': 'se', 'sd': 'sd', 'cv': 'cv', - 'unit':'unit.raw', - } + 'unit': 'unit.raw', + } ordering_fields = { 'choice': 'choice.raw', "count": 'count', } - class IndividualCharacteristicaViewSet(AccessView): @@ -321,30 +314,25 @@ class IndividualCharacteristicaViewSet(AccessView): ############################################################ -#Views queried not from elastic search +# Views queried not from elastic search ########################################################### class DataFileViewSet(viewsets.ModelViewSet): - queryset = DataFile.objects.all() serializer_class = DataFileSerializer permission_classes = (StudyPermission,) - def create(self, request, *args, **kwargs): try: DataFile.objects.filter(file=f"data/{request.data['file'].name}").delete() - #same_files = DataFile.objects.filter(file = request.data["file"].name) + # same_files = DataFile.objects.filter(file = request.data["file"].name) except DataFile.DoesNotExist: pass return super().create(request, *args, **kwargs) - - - class CharacteristicaOptionViewSet(viewsets.ViewSet): @staticmethod @@ -355,5 +343,3 @@ def get_options(): def list(self, request): return Response(self.get_options()) - - diff --git a/backend/pkdb_app/substances/apps.py b/backend/pkdb_app/substances/apps.py index 127e021b..c127665e 100644 --- a/backend/pkdb_app/substances/apps.py +++ b/backend/pkdb_app/substances/apps.py @@ -3,4 +3,3 @@ class SubstancesConfig(AppConfig): name = "substances" - diff --git a/backend/pkdb_app/substances/documents.py b/backend/pkdb_app/substances/documents.py index 224bf122..e5c9bc8c 100644 --- a/backend/pkdb_app/substances/documents.py +++ b/backend/pkdb_app/substances/documents.py @@ -3,6 +3,7 @@ from ..documents import string_field, elastic_settings, ObjectField, text_field from .models import Substance + # ------------------------------------ # Elastic Substance Document # ------------------------------------ diff --git a/backend/pkdb_app/substances/managers.py b/backend/pkdb_app/substances/managers.py index 59919efb..91125866 100644 --- a/backend/pkdb_app/substances/managers.py +++ b/backend/pkdb_app/substances/managers.py @@ -3,6 +3,7 @@ """ from django.db import models + class SubstanceManager(models.Manager): def update_or_create(self, *args, **kwargs): parents = kwargs["defaults"].pop('parents', []) @@ -12,6 +13,3 @@ def update_or_create(self, *args, **kwargs): substance.synonyms.add(*synonyms) substance.save() return substance - - - diff --git a/backend/pkdb_app/substances/serializers.py b/backend/pkdb_app/substances/serializers.py index e9c07b77..023288c1 100644 --- a/backend/pkdb_app/substances/serializers.py +++ b/backend/pkdb_app/substances/serializers.py @@ -5,8 +5,7 @@ from pkdb_app.categorials.serializers import AnnotationSerializer from rest_framework import serializers - -from pkdb_app.substances.models import Substance,SubstanceSynonym +from pkdb_app.substances.models import Substance, SubstanceSynonym from pkdb_app.serializers import WrongKeyValidationSerializer # ---------------------------------- @@ -28,17 +27,17 @@ def to_representation(self, instance): return instance.name - class SubstanceSerializer(WrongKeyValidationSerializer): """ Substance. """ - parents = utils.SlugRelatedField(many=True, slug_field="name",queryset=Substance.objects.order_by('name'), required=False, allow_null=True) + parents = utils.SlugRelatedField(many=True, slug_field="name", queryset=Substance.objects.order_by('name'), + required=False, allow_null=True) synonyms = SynonymSerializer(many=True, read_only=False, required=False, allow_null=True) annotations = AnnotationSerializer(many=True, read_only=False, required=False, allow_null=True) - class Meta: model = Substance - fields = ["sid","url_slug", "name" ,"parents","chebi","formula","charge", "mass", "description", "synonyms","creator", "annotations"] + fields = ["sid", "url_slug", "name", "parents", "chebi", "formula", "charge", "mass", "description", "synonyms", + "creator", "annotations"] def to_internal_value(self, data): data["creator"] = self.context['request'].user.id @@ -56,7 +55,7 @@ def create(self, validated_data): substance = Substance.objects.create(**validated_data) update_or_create_multiple(substance, synonyms_data, "synonyms", lookup_fields=["name"]) - update_or_create_multiple(substance, annotations_data, "annotations", lookup_fields=["term","relation"]) + update_or_create_multiple(substance, annotations_data, "annotations", lookup_fields=["term", "relation"]) substance.parents.add(*parents_data) @@ -85,16 +84,15 @@ def update(self, instance, validated_data): class SubstanceStatisticsSerializer(serializers.ModelSerializer): """ Substance. """ - #studies = serializers.StringRelatedField(many=True, read_only=True) - interventions = serializers.PrimaryKeyRelatedField(many=True, source="interventions_normed",read_only=True) + # studies = serializers.StringRelatedField(many=True, read_only=True) + interventions = serializers.PrimaryKeyRelatedField(many=True, source="interventions_normed", read_only=True) outputs = serializers.PrimaryKeyRelatedField(many=True, source="outputs_normed", read_only=True) outputs_calculated = serializers.PrimaryKeyRelatedField(many=True, read_only=True) - timecourses = serializers.PrimaryKeyRelatedField(many=True, source="timecourses_normed",read_only=True) - + timecourses = serializers.PrimaryKeyRelatedField(many=True, source="timecourses_normed", read_only=True) class Meta: model = Substance - fields = ["name","outputs","outputs_calculated","interventions","timecourses"] + fields = ["name", "outputs", "outputs_calculated", "interventions", "timecourses"] ############################################################################################### @@ -109,8 +107,9 @@ class Meta: class SubstanceElasticSerializer(serializers.HyperlinkedModelSerializer): parents = SubstanceSmallElasticSerializer(many=True) - annotations = AnnotationSerializer(many=True,allow_null=True) + annotations = AnnotationSerializer(many=True, allow_null=True) class Meta: model = Substance - fields = ["sid", 'url_slug', "name", "mass","charge", "formula", "derived", "description","parents", "annotations"] + fields = ["sid", 'url_slug', "name", "mass", "charge", "formula", "derived", "description", "parents", + "annotations"] diff --git a/backend/pkdb_app/substances/views.py b/backend/pkdb_app/substances/views.py index cca8d013..8689897c 100644 --- a/backend/pkdb_app/substances/views.py +++ b/backend/pkdb_app/substances/views.py @@ -6,11 +6,12 @@ from rest_framework.parsers import JSONParser, MultiPartParser, FormParser from .documents import SubstanceDocument from .models import Substance -from .serializers import SubstanceSerializer, SubstanceStatisticsSerializer, SubstanceElasticSerializer +from .serializers import SubstanceSerializer, SubstanceStatisticsSerializer, SubstanceElasticSerializer from rest_framework.permissions import IsAdminUser from ..pagination import CustomPagination + ############################################################################################### # Upload/External Views ############################################################################################### @@ -22,10 +23,12 @@ class SubstanceViewSet(viewsets.ModelViewSet): permission_classes = (IsAdminOrCreator,) lookup_field = "url_slug" + class SubstanceStatisticsViewSet(viewsets.ReadOnlyModelViewSet): queryset = Substance.objects.all() serializer_class = SubstanceStatisticsSerializer + ############################################################################################### # Elastic Views ############################################################################################### @@ -35,8 +38,8 @@ class ElasticSubstanceViewSet(DocumentViewSet): serializer_class = SubstanceElasticSerializer pagination_class = CustomPagination lookup_field = "url_slug" - filter_backends = [FilteringFilterBackend,IdsFilterBackend,OrderingFilterBackend,MultiMatchSearchFilterBackend, -] + filter_backends = [FilteringFilterBackend, IdsFilterBackend, OrderingFilterBackend, MultiMatchSearchFilterBackend, + ] search_fields = ('name', 'description', 'formula', @@ -45,9 +48,9 @@ class ElasticSubstanceViewSet(DocumentViewSet): 'annotations.description', 'annotations.label',) - multi_match_search_fields = {field:{"boost":1} for field in search_fields} + multi_match_search_fields = {field: {"boost": 1} for field in search_fields} multi_match_options = { 'operator': 'and' } - filter_fields = {'name': 'name.raw',} - ordering_fields = {'name': 'name.raw','formula':'formula.raw','derived':"derived.raw"} + filter_fields = {'name': 'name.raw', } + ordering_fields = {'name': 'name.raw', 'formula': 'formula.raw', 'derived': "derived.raw"} diff --git a/backend/pkdb_app/templates/allauth/account/base.html b/backend/pkdb_app/templates/allauth/account/base.html index f95d3a58..b8727dfb 100644 --- a/backend/pkdb_app/templates/allauth/account/base.html +++ b/backend/pkdb_app/templates/allauth/account/base.html @@ -4,23 +4,23 @@ {% block content %} -

{% trans 'My Account' %}

+

{% trans 'My Account' %}

- -{% block account_content %} -{% endblock %} + + {% block account_content %} + {% endblock %} {% endblock %} diff --git a/backend/pkdb_app/templates/allauth/account/email.html b/backend/pkdb_app/templates/allauth/account/email.html index 4e1c0d3c..1e705cb3 100644 --- a/backend/pkdb_app/templates/allauth/account/email.html +++ b/backend/pkdb_app/templates/allauth/account/email.html @@ -9,57 +9,63 @@ {% block account_content %} -{% if user.emailaddress_set.all %} -

{% trans 'The following e-mail addresses are associated to your account:' %}

- - - -{% else %} -

{% trans 'Warning:'%} {% trans "You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc." %}

- -{% endif %} + {% if user.emailaddress_set.all %} +

{% trans 'The following e-mail addresses are associated to your account:' %}

+ + + + {% else %} +

+ {% trans 'Warning:' %} {% trans "You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc." %} +

+ + {% endif %}

{% trans "Add E-mail Address" %}

@@ -68,7 +74,7 @@

{% trans "Add E-mail Address" %}

{% csrf_token %} {{ add_email_form|bootstrap }}
- +
@@ -76,14 +82,14 @@

{% trans "Add E-mail Address" %}

{% block extra_body %} - + {% endblock %} diff --git a/backend/pkdb_app/templates/allauth/account/email_confirm.html b/backend/pkdb_app/templates/allauth/account/email_confirm.html index e3ea6c9a..b037149d 100644 --- a/backend/pkdb_app/templates/allauth/account/email_confirm.html +++ b/backend/pkdb_app/templates/allauth/account/email_confirm.html @@ -7,25 +7,28 @@ {% block content %} -

{% trans "Confirm E-mail Address" %}

+

{% trans "Confirm E-mail Address" %}

-{% if confirmation %} + {% if confirmation %} -{% user_display confirmation.email_address.user as user_display %} + {% user_display confirmation.email_address.user as user_display %} -

{% blocktrans with confirmation.email_address.email as email %}Please confirm that {{ email }} is an e-mail address for user {{ user_display }}.{% endblocktrans %}

+

{% blocktrans with confirmation.email_address.email as email %}Please confirm that + {{ email }} is an e-mail address for user {{ user_display }} + .{% endblocktrans %}

-
-{% csrf_token %} - -
+
+ {% csrf_token %} + +
-{% else %} + {% else %} -{% url 'account_email' as email_url %} + {% url 'account_email' as email_url %} -

{% blocktrans %}This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request.{% endblocktrans %}

+

{% blocktrans %}This e-mail confirmation link expired or is invalid. Please + issue a new e-mail confirmation request.{% endblocktrans %}

-{% endif %} + {% endif %} {% endblock %} diff --git a/backend/pkdb_app/templates/allauth/account/login.html b/backend/pkdb_app/templates/allauth/account/login.html index f76c5337..4d340923 100644 --- a/backend/pkdb_app/templates/allauth/account/login.html +++ b/backend/pkdb_app/templates/allauth/account/login.html @@ -9,40 +9,40 @@ {% block content %} -

{% trans "Sign In" %}

+

{% trans "Sign In" %}

-{% get_providers as socialaccount_providers %} -{% if socialaccount_providers %} -

{% blocktrans with site.name as site_name %}Please sign in with one -of your existing third party accounts. Or, sign up -for a {{ site_name }} account and sign in -below:{% endblocktrans %}

+ {% get_providers as socialaccount_providers %} + {% if socialaccount_providers %} +

{% blocktrans with site.name as site_name %}Please sign in with one + of your existing third party accounts. Or, sign up + for a {{ site_name }} account and sign in + below:{% endblocktrans %}

-
+
-
    - {% include "socialaccount/snippets/provider_list.html" with process="login" %} -
+
    + {% include "socialaccount/snippets/provider_list.html" with process="login" %} +
- + -
+
-{% include "socialaccount/snippets/login_extra.html" %} + {% include "socialaccount/snippets/login_extra.html" %} -{% endif %} + {% endif %} - + {% endblock %} diff --git a/backend/pkdb_app/templates/allauth/account/logout.html b/backend/pkdb_app/templates/allauth/account/logout.html index 2dcedf5b..a0e77e82 100644 --- a/backend/pkdb_app/templates/allauth/account/logout.html +++ b/backend/pkdb_app/templates/allauth/account/logout.html @@ -5,17 +5,17 @@ {% block head_title %}{% trans "Sign Out" %}{% endblock %} {% block content %} -

{% trans "Sign Out" %}

+

{% trans "Sign Out" %}

-

{% trans 'Are you sure you want to sign out?' %}

+

{% trans 'Are you sure you want to sign out?' %}

-
- {% csrf_token %} - {% if redirect_field_value %} - - {% endif %} - -
+
+ {% csrf_token %} + {% if redirect_field_value %} + + {% endif %} + +
{% endblock %} diff --git a/backend/pkdb_app/templates/allauth/account/password_change.html b/backend/pkdb_app/templates/allauth/account/password_change.html index cf7902ff..2134e629 100644 --- a/backend/pkdb_app/templates/allauth/account/password_change.html +++ b/backend/pkdb_app/templates/allauth/account/password_change.html @@ -11,7 +11,7 @@ {% csrf_token %} {{ password_change_form|bootstrap }}
- +
{% endblock %} diff --git a/backend/pkdb_app/templates/allauth/account/password_reset.html b/backend/pkdb_app/templates/allauth/account/password_reset.html index b42a4266..bb1dc3b4 100644 --- a/backend/pkdb_app/templates/allauth/account/password_reset.html +++ b/backend/pkdb_app/templates/allauth/account/password_reset.html @@ -10,19 +10,19 @@

{% trans "Password Reset" %}

{% if user.is_authenticated %} - {% include "account/snippets/already_logged_in.html" %} + {% include "account/snippets/already_logged_in.html" %} {% endif %} - +

{% trans "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}

- -
+ + {% csrf_token %} {{ password_reset_form|bootstrap }}
- +
- +

{% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}

{% endblock %} diff --git a/backend/pkdb_app/templates/allauth/account/password_reset_from_key.html b/backend/pkdb_app/templates/allauth/account/password_reset_from_key.html index f4b7cd5f..32e34d34 100644 --- a/backend/pkdb_app/templates/allauth/account/password_reset_from_key.html +++ b/backend/pkdb_app/templates/allauth/account/password_reset_from_key.html @@ -6,24 +6,25 @@ {% block head_title %}{% trans "Change Password" %}{% endblock %} {% block content %} -

{% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}

+

{% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}

-{% if token_fail %} -{% url 'account_reset_password' as passwd_reset_url %} -

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

+ {% if token_fail %} + {% url 'account_reset_password' as passwd_reset_url %} +

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

-{% else %} -{% if form %} -
- {% csrf_token %} - {{ form|bootstrap }} -
- -
-
-{% else %} -

{% trans 'Your password is now changed.' %}

-{% endif %} -{% endif %} + {% else %} + {% if form %} +
+ {% csrf_token %} + {{ form|bootstrap }} +
+ +
+
+ {% else %} +

{% trans 'Your password is now changed.' %}

+ {% endif %} + {% endif %} {% endblock %} diff --git a/backend/pkdb_app/templates/allauth/account/password_set.html b/backend/pkdb_app/templates/allauth/account/password_set.html index 0009ab3a..5a3dd490 100644 --- a/backend/pkdb_app/templates/allauth/account/password_set.html +++ b/backend/pkdb_app/templates/allauth/account/password_set.html @@ -7,11 +7,11 @@ {% block account_nav_change_password %}active{% endblock %} {% block account_content %} -
- {% csrf_token %} - {{ password_set_form|bootstrap }} -
- -
-
+
+ {% csrf_token %} + {{ password_set_form|bootstrap }} +
+ +
+
{% endblock %} diff --git a/backend/pkdb_app/templates/allauth/account/signup.html b/backend/pkdb_app/templates/allauth/account/signup.html index 38e9c471..929c4bb2 100644 --- a/backend/pkdb_app/templates/allauth/account/signup.html +++ b/backend/pkdb_app/templates/allauth/account/signup.html @@ -6,19 +6,20 @@ {% block head_title %}{% trans "Signup" %}{% endblock %} {% block content %} -

{% trans "Sign Up" %}

+

{% trans "Sign Up" %}

-

{% blocktrans %}Already have an account? Then please sign in.{% endblocktrans %}

+

{% blocktrans %}Already have an account? Then please sign in.{% endblocktrans %} +

-
- {% csrf_token %} - {{ form|bootstrap }} - {% if redirect_field_value %} - - {% endif %} -
- -
-
+
+ {% csrf_token %} + {{ form|bootstrap }} + {% if redirect_field_value %} + + {% endif %} +
+ +
+
{% endblock %} diff --git a/backend/pkdb_app/templates/allauth/socialaccount/connections.html b/backend/pkdb_app/templates/allauth/socialaccount/connections.html index ac3f757e..f99e7812 100644 --- a/backend/pkdb_app/templates/allauth/socialaccount/connections.html +++ b/backend/pkdb_app/templates/allauth/socialaccount/connections.html @@ -3,76 +3,78 @@ {% load i18n %} {% block head_title %}{% trans "Connected Accounts" %}{% endblock %} -{% block account_nav_socialaccount_connections %}active{% endblock %} +{% block account_nav_socialaccount_connections %}active{% endblock %} {% block account_content %} -{% if form.accounts %} -

{% blocktrans %}You can sign in to your account using any of the following third party accounts:{% endblocktrans %}

- - -
-{% csrf_token %} - -{% if form.non_field_errors %} -
- × - {% for non_field_error in form.non_field_errors %} - {{ non_field_error }} - {% endfor %} -
-{% endif %} - - - - - - - - - - -{% for base_account in form.accounts %} -{% with base_account.get_provider_account as account %} - - - - -{% endwith %} -{% endfor %} - -
- {% trans 'Provider' %} - - {% trans 'Account' %} -
- - - {{account}} -
- -
- -
- -
- -{% else %} -
-{% trans 'None!' %} {% trans 'You currently have no social network accounts connected to this account.' %} -
-{% endif %} - -

{% trans 'Add a 3rd Party Account' %}

- -
    -{% include "socialaccount/snippets/provider_list.html" with process="connect" %} -
- -{% include "socialaccount/snippets/login_extra.html" %} + {% if form.accounts %} +

{% blocktrans %}You can sign in to your account using any of the following third party + accounts:{% endblocktrans %}

+ + +
+ {% csrf_token %} + + {% if form.non_field_errors %} +
+ × + {% for non_field_error in form.non_field_errors %} + {{ non_field_error }} + {% endfor %} +
+ {% endif %} + + + + + + + + + + + {% for base_account in form.accounts %} + {% with base_account.get_provider_account as account %} + + + + + {% endwith %} + {% endfor %} + +
+ {% trans 'Provider' %} + + {% trans 'Account' %} +
+ + + {{ account }} +
+ +
+ +
+ +
+ + {% else %} +
+ {% trans 'None!' %} {% trans 'You currently have no social network accounts connected to this account.' %} +
+ {% endif %} + +

{% trans 'Add a 3rd Party Account' %}

+ +
    + {% include "socialaccount/snippets/provider_list.html" with process="connect" %} +
+ + {% include "socialaccount/snippets/login_extra.html" %} {% endblock %} diff --git a/backend/pkdb_app/templates/allauth/socialaccount/signup.html b/backend/pkdb_app/templates/allauth/socialaccount/signup.html index d2cb953d..a3d236ae 100644 --- a/backend/pkdb_app/templates/allauth/socialaccount/signup.html +++ b/backend/pkdb_app/templates/allauth/socialaccount/signup.html @@ -8,20 +8,21 @@ {% block content %}

{% trans "Sign Up" %}

-

{% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to -{{site_name}}. As a final step, please complete the following form:{% endblocktrans %}

- - - +

{% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your + {{ provider_name }} account to login to + {{ site_name }}. As a final step, please complete the following form:{% endblocktrans %}

+ + + {% endblock %} diff --git a/backend/pkdb_app/templates/base.html b/backend/pkdb_app/templates/base.html index 6f4cb06e..b6954369 100644 --- a/backend/pkdb_app/templates/base.html +++ b/backend/pkdb_app/templates/base.html @@ -3,17 +3,17 @@ - - - - {% block title %}PK-DB{% endblock %} + + + + {% block title %}PK-DB{% endblock %} - - + + - {% block head_css %} - - {% endblock %} + {% block head_css %} + + {% endblock %} @@ -22,8 +22,8 @@ {% block content %}{% endblock %} {% block footer %} -
-
+
+
{% endblock %} {% block tail_js %} diff --git a/backend/pkdb_app/tests/test_api.py b/backend/pkdb_app/tests/test_api.py index 632bd6b6..b1fe6518 100644 --- a/backend/pkdb_app/tests/test_api.py +++ b/backend/pkdb_app/tests/test_api.py @@ -3,14 +3,14 @@ import os import sys -#import requests +# import requests from django.urls import reverse from rest_framework.test import APITestCase, APIClient, RequestsClient from django.core.exceptions import ObjectDoesNotExist from pkdb_app.comments.models import Comment -#from pkdb_app.data_management.setup_database import setup_database -#from pkdb_app.data_management.upload_studies import upload_study_from_dir, read_reference_json, \ +# from pkdb_app.data_management.setup_database import setup_database +# from pkdb_app.data_management.upload_studies import upload_study_from_dir, read_reference_json, \ # upload_reference_json, upload_files from pkdb_app.interventions.models import Substance @@ -32,15 +32,16 @@ def setUp(self): def test_api_token_auth(self): response = self.client.post("/api-token-auth/", data={"username": "admin", "password": self.password}) - assert json.loads(response.content) == {"non_field_errors":["Unable to log in with provided credentials."]} , json.loads(response.content) - + assert json.loads(response.content) == { + "non_field_errors": ["Unable to log in with provided credentials."]}, json.loads(response.content) def test_create_superuser(self): User.objects.create_superuser(username="admin", password=self.password, email="") response = self.client.post("/api-token-auth/", data={"username": "admin", "password": self.password}) assert response.status_code == 200, response.status_code - assert "token" in json.loads(response.content) ,json.loads(response.content) + assert "token" in json.loads(response.content), json.loads(response.content) + ''' class UploadStudy(APITestCase): diff --git a/backend/pkdb_app/tests/test_serializer.py b/backend/pkdb_app/tests/test_serializer.py index 62217e03..d3a3e805 100644 --- a/backend/pkdb_app/tests/test_serializer.py +++ b/backend/pkdb_app/tests/test_serializer.py @@ -1,4 +1,3 @@ - from django.test import RequestFactory from pkdb_app.categorials.models import CharacteristicType from pkdb_app.categorials.serializers import CharacteristicTypeSerializer @@ -15,62 +14,52 @@ def setUp(self): self.request.user = self.user - - self.intervention_attributes = { - } self.characteristica_types = [ - { - "key": "sex", - "category": "demographics", - "dtype": "categorial", - "choices": [ - "M", - "F", - "Mixed", - "NaN" - ], - "units": [], - "url_slug": "sex" - }, - { - "key": "healthy", - "category": "patient status", - "dtype": "boolean", - "choices": [ - "Y", - "N", - "Mixed", - "NaN" - ], - "units": [], - "url_slug": "healthy" - }, - { - "key": "age", - "category": "demographics", - "dtype": "numeric", - "choices": None, - "units": [ - "yr" - ], - "url_slug": "age" - } + { + "key": "sex", + "category": "demographics", + "dtype": "categorial", + "choices": [ + "M", + "F", + "Mixed", + "NaN" + ], + "units": [], + "url_slug": "sex" + }, + { + "key": "healthy", + "category": "patient status", + "dtype": "boolean", + "choices": [ + "Y", + "N", + "Mixed", + "NaN" + ], + "units": [], + "url_slug": "healthy" + }, + { + "key": "age", + "category": "demographics", + "dtype": "numeric", + "choices": None, + "units": [ + "yr" + ], + "url_slug": "age" + } ] - - - def test_characteristic_type_serializer(self): for instance in self.characteristica_types: - s_instance = CharacteristicTypeSerializer(data = instance, context={'request':self.request}) + s_instance = CharacteristicTypeSerializer(data=instance, context={'request': self.request}) assert s_instance.is_valid() s_instance.create(s_instance.validated_data) assert len(CharacteristicType.objects.all()) == 3, CharacteristicType.objects.all() - - - - diff --git a/backend/pkdb_app/tests/test_study/reference.json b/backend/pkdb_app/tests/test_study/reference.json index de2a9b63..93eb87bd 100644 --- a/backend/pkdb_app/tests/test_study/reference.json +++ b/backend/pkdb_app/tests/test_study/reference.json @@ -1,36 +1,36 @@ { - "pmid": 7589032, - "name": "Balogh1995", - "sid": 7589032, - "date": "1995-11-28", - "journal": "European journal of clinical pharmacology", - "title": "Influence of ethinylestradiol-containing combination oral contraceptives with gestodene or levonorgestrel on caffeine elimination.", - "abstract": "In a controlled clinical trial, the elimination of caffeine was examined in 20 healthy women prior to and during one cycle of treatment with either of two oral contraceptive formulations, one containing 0.075 mg gestodene and 0.03 mg ethinylestradiol and one containing 0.125 mg levonorgestrel and 0.03 mg ethinylestradiol. In addition, caffeine clearance was determined 1 month after the last intake of the oral contraceptives. Compared with pretreatment values, the clearance of caffeine was reduced by about 54% and 55% after one treatment cycle with gestodene- and the levonorgestrel-containing oral contraceptive, respectively. Other pharmacokinetic parameters of caffeine, such as tmax and Cmax, were not affected. Clearance values returned to pretreatment values 1 month after the last administration of the oral contraceptives. There was no difference in the reduction of caffeine clearance between contraceptive formulations. A small, but significant difference in the AUC(0-24 h) values of ethinylestradiol was noted between both preparations. There was no correlation between the AUC(model) values of caffeine and the AUC(0-24 h) values of ethinylestradiol. In the present study, a somewhat more pronounced effect on the elimination of caffeine was observed than in previous investigations, where several contraceptive steroids were administered only for a period of 2 weeks.", - "authors": [ - { - "first_name": "A", - "last_name": "Balogh" - }, - { - "first_name": "G", - "last_name": "Klinger" - }, - { - "first_name": "L", - "last_name": "Henschel" - }, - { - "first_name": "A", - "last_name": "B\u00f6rner" - }, - { - "first_name": "R", - "last_name": "Vollanth" - }, - { - "first_name": "W", - "last_name": "Kuhnz" - } - ], - "doi": null + "pmid": 7589032, + "name": "Balogh1995", + "sid": 7589032, + "date": "1995-11-28", + "journal": "European journal of clinical pharmacology", + "title": "Influence of ethinylestradiol-containing combination oral contraceptives with gestodene or levonorgestrel on caffeine elimination.", + "abstract": "In a controlled clinical trial, the elimination of caffeine was examined in 20 healthy women prior to and during one cycle of treatment with either of two oral contraceptive formulations, one containing 0.075 mg gestodene and 0.03 mg ethinylestradiol and one containing 0.125 mg levonorgestrel and 0.03 mg ethinylestradiol. In addition, caffeine clearance was determined 1 month after the last intake of the oral contraceptives. Compared with pretreatment values, the clearance of caffeine was reduced by about 54% and 55% after one treatment cycle with gestodene- and the levonorgestrel-containing oral contraceptive, respectively. Other pharmacokinetic parameters of caffeine, such as tmax and Cmax, were not affected. Clearance values returned to pretreatment values 1 month after the last administration of the oral contraceptives. There was no difference in the reduction of caffeine clearance between contraceptive formulations. A small, but significant difference in the AUC(0-24 h) values of ethinylestradiol was noted between both preparations. There was no correlation between the AUC(model) values of caffeine and the AUC(0-24 h) values of ethinylestradiol. In the present study, a somewhat more pronounced effect on the elimination of caffeine was observed than in previous investigations, where several contraceptive steroids were administered only for a period of 2 weeks.", + "authors": [ + { + "first_name": "A", + "last_name": "Balogh" + }, + { + "first_name": "G", + "last_name": "Klinger" + }, + { + "first_name": "L", + "last_name": "Henschel" + }, + { + "first_name": "A", + "last_name": "B\u00f6rner" + }, + { + "first_name": "R", + "last_name": "Vollanth" + }, + { + "first_name": "W", + "last_name": "Kuhnz" + } + ], + "doi": null } \ No newline at end of file diff --git a/backend/pkdb_app/tests/test_study/study.json b/backend/pkdb_app/tests/test_study/study.json index 2c2c39b3..ac2a96e5 100644 --- a/backend/pkdb_app/tests/test_study/study.json +++ b/backend/pkdb_app/tests/test_study/study.json @@ -167,9 +167,10 @@ "category": "sex", "choice": "col==sex" } - ] - } - ]}, + ] + } + ] + }, "interventionset": { "descriptions": [ "The drug (200 mg caffeine as uncoated tablet, Berlin Chemie, Germany) was administered in the morning after an overnight fast, together with 200 ml herbal tea. On day 21 of the treatment cycle, caffeine was administered 30min after the intake of the oral contraceptive. All volunteers had been instructed to refrain for at least 36 h prior to and during the caffeine test from all methylxanthine-containing beverages and food.", @@ -295,7 +296,7 @@ "unit": "ml/min || µg/ml || h || h || l" } ], - "timecourses": [ + "timecourses": [ { "group": "col==subject", "subset": "subject_type==group", @@ -312,7 +313,7 @@ "sd": "col==caf_sd || col==px_sd || col==px_caf_sd", "unit": "µg/ml || µg/ml || -" }, - { + { "individual": "col==subject", "subset": "subject_type==individual", "groupby": "subject", @@ -320,7 +321,6 @@ "Dcaf" ], "source": "test_study_Fig3.csv", - "figure": "test_study_Fig3.png", "substance": "caffeine || paraxanthine || paraxanthine/caffeine", "tissue": "plasma", diff --git a/backend/pkdb_app/urls.py b/backend/pkdb_app/urls.py index a960cd24..fd070b6f 100755 --- a/backend/pkdb_app/urls.py +++ b/backend/pkdb_app/urls.py @@ -68,7 +68,6 @@ router.register("statistics", StatisticsViewSet, base_name="statistics") - ############################################################################################### # Read URLs ############################################################################################### @@ -78,8 +77,8 @@ router.register("characteristica_elastic", CharacteristicaElasticViewSet, base_name="characteristica_elastic") router.register("characteristica_groups", GroupCharacteristicaViewSet, base_name="characteristica_groups") -router.register("characteristica_individuals", IndividualCharacteristicaViewSet, base_name="characteristica_individuals") - +router.register("characteristica_individuals", IndividualCharacteristicaViewSet, + base_name="characteristica_individuals") router.register("interventions_elastic", ElasticInterventionViewSet, base_name="interventions_elastic") router.register("timecourses_elastic", ElasticTimecourseViewSet, base_name="timecourses_elastic") @@ -87,8 +86,6 @@ router.register("output_intervention", OutputInterventionViewSet, base_name="output_intervention") router.register("timecourse_intervention", TimecourseInterventionViewSet, base_name="timecourse_intervention") - - # Options router.register( "characteristica_options", CharacteristicaOptionViewSet, base_name="characteristica_option" @@ -105,10 +102,9 @@ schema_view = get_swagger_view(title="PKDB API") - urlpatterns = [ # authentication - #(r'^accounts_old/', include('allauth.urls')), + # (r'^accounts_old/', include('allauth.urls')), url(r'^accounts/', include('rest_email_auth.urls')), # admin @@ -130,4 +126,4 @@ # the 'api-root' from django rest-frameworks default router # http://www.django-rest-framework.org/api-guide/routers/#defaultrouter # re_path(r'^$', RedirectView.as_view(url=reverse_lazy('api-root'), permanent=False)), -] #+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +] # + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/backend/pkdb_app/users/management/commands/createsuperuser2.py b/backend/pkdb_app/users/management/commands/createsuperuser2.py index 7b14465e..46759803 100644 --- a/backend/pkdb_app/users/management/commands/createsuperuser2.py +++ b/backend/pkdb_app/users/management/commands/createsuperuser2.py @@ -14,7 +14,6 @@ def add_arguments(self, parser): help='Specifies the password for the superuser.', ) - def handle(self, *args, **options): password = options.get('password') username = options.get('username') @@ -37,8 +36,5 @@ def handle(self, *args, **options): user = self.UserModel._default_manager.db_manager(database).get(username=username) user.set_password(password) user.save() - email_dict = {"email": email, "is_primary": True, "is_verified": True, "user":user} + email_dict = {"email": email, "is_primary": True, "is_verified": True, "user": user} email = EmailAddress.objects.create(**email_dict) - - - diff --git a/backend/pkdb_app/users/models.py b/backend/pkdb_app/users/models.py index d6f25a9d..e58d3e93 100644 --- a/backend/pkdb_app/users/models.py +++ b/backend/pkdb_app/users/models.py @@ -23,4 +23,4 @@ def create_auth_token(sender, instance=None, created=False, **kwargs): PUBLIC = "public" -PRIVATE = "private" \ No newline at end of file +PRIVATE = "private" diff --git a/backend/pkdb_app/users/permissions.py b/backend/pkdb_app/users/permissions.py index 58ada1cb..364d1163 100644 --- a/backend/pkdb_app/users/permissions.py +++ b/backend/pkdb_app/users/permissions.py @@ -5,28 +5,29 @@ from pkdb_app.users.serializers import UserSerializer from rest_framework import permissions + def is_allowed_method(request): - allowed_methods = ["PUT",*permissions.SAFE_METHODS] - if request.method in allowed_methods : + allowed_methods = ["PUT", *permissions.SAFE_METHODS] + if request.method in allowed_methods: return True return False + class IsUserOrReadOnly(permissions.BasePermission): """ Object-level permission to only allow owners of an object to edit it. """ def has_object_permission(self, request, view, obj): - if request.method in permissions.SAFE_METHODS: return True return obj == request.user + class IsAdminOrCreator(permissions.BasePermission): def has_object_permission(self, request, view, obj): - if is_allowed_method(request): return True @@ -34,8 +35,6 @@ def has_object_permission(self, request, view, obj): return user.is_staff or (user == obj.creator) - - class IsAdminOrCreatorOrCurator(permissions.BasePermission): """ for study and reference @@ -47,36 +46,34 @@ def has_object_permission(self, request, view, obj): return True # for reference model - if hasattr(obj,"study"): + if hasattr(obj, "study"): allowed_user = (request.user == obj.study.creator) or (request.user in obj.study.curators.all()) else: allowed_user = False - return request.user.is_staff or allowed_user -class StudyPermission(permissions.BasePermission): +class StudyPermission(permissions.BasePermission): def has_object_permission(self, request, view, obj): - if hasattr(obj,"study"): + if hasattr(obj, "study"): if obj.study: obj = obj.study - return study_permissions(request,obj) + return study_permissions(request, obj) def study_permissions(request, obj): study_permissions = {"admin": admin_permission(), "basic": basic_permission(request, obj), - "reviewer": reviewer_permission(request,obj), + "reviewer": reviewer_permission(request, obj), "anonymous": anonymous_permissions(request, obj)} - return study_permissions[user_group(request.user)] -def user_group(user): +def user_group(user): try: user_group = user.groups.first().name except AttributeError: @@ -89,24 +86,25 @@ def user_group(user): return user_group -def get_study_permission(user,obj): + +def get_study_permission(user, obj): try: allowed_user_modify = (user == obj.creator) or (user in obj.curators) - allow_user_get =(user in obj.collaborators) or (obj.access == PUBLIC) or allowed_user_modify + allow_user_get = (user in obj.collaborators) or (obj.access == PUBLIC) or allowed_user_modify except TypeError: allowed_user_modify = (user == obj.creator) or (user in obj.curators.all()) allow_user_get = (user in obj.collaborators.all()) or (obj.access == PUBLIC) or allowed_user_modify - permission_dict = { + permission_dict = { "admin": True, - "anonymous":(obj.access == PUBLIC), + "anonymous": (obj.access == PUBLIC), "reviewer": True, "basic": allow_user_get - } + } return permission_dict[user_group(user)] -def get_study_file_permission(user,obj): +def get_study_file_permission(user, obj): allow_user_get = False if isinstance(obj, AttrDict) or isinstance(obj, DictionaryProxy): username = user.username @@ -119,23 +117,22 @@ def get_study_file_permission(user,obj): allowed_user_modify = (user == obj.creator) or (user in obj.curators.all()) allow_user_get = (user in obj.collaborators.all()) or (obj.licence == OPEN) or allowed_user_modify - permission_dict = { + permission_dict = { "admin": True, - "anonymous":obj.licence == OPEN, + "anonymous": obj.licence == OPEN, "reviewer": True, "basic": allow_user_get - } + } return permission_dict[user_group(user)] -def anonymous_permissions(request,obj): +def anonymous_permissions(request, obj): if is_allowed_method(request): return get_study_permission(request.user, obj) return False def basic_permission(request, obj): - user = request.user try: allowed_user_modify = (user == obj.creator) or (user in obj.curators) @@ -145,12 +142,10 @@ def basic_permission(request, obj): if is_allowed_method(request): return get_study_permission(user, obj) - return allowed_user_modify -def reviewer_permission(request,obj): - +def reviewer_permission(request, obj): if is_allowed_method(request): return get_study_permission(request.user, obj) else: @@ -159,6 +154,3 @@ def reviewer_permission(request,obj): def admin_permission(): return True - - - diff --git a/backend/pkdb_app/users/serializers.py b/backend/pkdb_app/users/serializers.py index 958dd599..89de77cf 100644 --- a/backend/pkdb_app/users/serializers.py +++ b/backend/pkdb_app/users/serializers.py @@ -8,6 +8,7 @@ from django.contrib.auth.models import Group from rest_email_auth import models, signals + class UserSerializer(serializers.ModelSerializer): groups = serializers.SlugRelatedField( queryset=Group.objects.all(), @@ -15,29 +16,32 @@ class UserSerializer(serializers.ModelSerializer): required=True, many=True ) + class Meta: model = User - fields = ("id", "username", "first_name", "last_name","groups") + fields = ("id", "username", "first_name", "last_name", "groups") read_only_fields = ("username",) class UserGroupSerializer(serializers.ModelSerializer): class Meta: model = Group - fields = ["name","permissions"] + fields = ["name", "permissions"] + class AuthTokenSerializerCostum(AuthTokenSerializer): def validate(self, attrs): result = super().validate(attrs) user = VerifiedEmailBackend().authenticate(request=self.context.get('request'), - password=attrs["password"], email=result["user"].email) + password=attrs["password"], email=result["user"].email) if not user: msg = 'User is not verified. Check your mail for the verification key.' raise serializers.ValidationError(msg, code='authorization') return result + class UserRegistrationSerializer(RegistrationSerializer): class Meta(object): extra_kwargs = { @@ -134,14 +138,11 @@ def update(self, instance, validated_data): instance.save() return instance - def create_verified_email(self,user): + def create_verified_email(self, user): email_dict = {"email": user.email, "is_primary": True, "is_verified": True, "user": user} email = models.EmailAddress.objects.create(**email_dict) return email - - - class Meta: model = User fields = ( @@ -166,5 +167,5 @@ class Meta: class UserElasticSerializer(serializers.ModelSerializer): class Meta: model = User - fields = ("id", "first_name", "last_name","username") + fields = ("id", "first_name", "last_name", "username") read_only_fields = ("username",) diff --git a/backend/pkdb_app/users/views.py b/backend/pkdb_app/users/views.py index c5aa77dd..273f8c62 100644 --- a/backend/pkdb_app/users/views.py +++ b/backend/pkdb_app/users/views.py @@ -21,7 +21,6 @@ class UserViewSet( class UserGroupViewSet(viewsets.ModelViewSet): - queryset = Group.objects.all() serializer_class = UserGroupSerializer permission_classes = (IsAdminUser,) @@ -36,10 +35,9 @@ class UserCreateViewSet(mixins.CreateModelMixin, mixins.UpdateModelMixin, viewse serializer_class = CreateUserSerializer permission_classes = (IsAdminUser,) - #def create(self, request, *args, **kwargs): + # def create(self, request, *args, **kwargs): # return super().create(request, *args, **kwargs) class ObtainAuthTokenCustom(ObtainAuthToken): serializer_class = AuthTokenSerializerCostum - diff --git a/backend/pkdb_app/utils.py b/backend/pkdb_app/utils.py index 4b1b8344..5781fa5c 100644 --- a/backend/pkdb_app/utils.py +++ b/backend/pkdb_app/utils.py @@ -16,13 +16,15 @@ class SlugRelatedField(serializers.SlugRelatedField): 'invalid': _('Invalid value.'), } + def list_duplicates(seq): - seen = set() - seen_add = seen.add - # adds all elements it doesn't know yet to seen and all other to seen_twice - seen_twice = set(x for x in seq if x in seen or seen_add(x)) - # turn the set into a list (as requested) - return list( seen_twice ) + seen = set() + seen_add = seen.add + # adds all elements it doesn't know yet to seen and all other to seen_twice + seen_twice = set(x for x in seq if x in seen or seen_add(x)) + # turn the set into a list (as requested) + return list(seen_twice) + def create_choices(collection): """ Creates choices from given list of items. @@ -58,7 +60,8 @@ def clean_import(data): return clean_dict -def list_of_pk(field,obj): + +def list_of_pk(field, obj): result = [] try: relevant_field = obj.to_dict().get(field) @@ -69,6 +72,7 @@ def list_of_pk(field,obj): result = [int(field_list["pk"]) for field_list in relevant_field] return result + def ensure_dir(file_path): """ Checks for directory and creates if non-existant.""" directory = os.path.dirname(file_path) @@ -87,13 +91,13 @@ def update_or_create_multiple(parent, children, related_name, lookup_fields=[]): else: lookup_dict = child - #instance_child.update_or_create(**lookup_dict, defaults=child) + # instance_child.update_or_create(**lookup_dict, defaults=child) try: obj = instance_child.get(**lookup_dict) for key, value in child.items(): if key == "annotations": - update_or_create_multiple(obj,value,key,lookup_fields=["term","relation"]) + update_or_create_multiple(obj, value, key, lookup_fields=["term", "relation"]) else: setattr(obj, key, value) @@ -102,31 +106,27 @@ def update_or_create_multiple(parent, children, related_name, lookup_fields=[]): except instance_child.model.DoesNotExist: - instance_dict = {**lookup_dict,**child} + instance_dict = {**lookup_dict, **child} instance_child.create(**instance_dict) - - - - - - - def create_multiple(parent, children, related_name): - instance_child = getattr(parent, related_name) return [instance_child.create(**child) for child in children] -def create_multiple_bulk(parent,related_name_parent,children,class_child): - return class_child.objects.bulk_create([class_child(**{related_name_parent:parent,**child}) for child in children]) + +def create_multiple_bulk(parent, related_name_parent, children, class_child): + return class_child.objects.bulk_create( + [class_child(**{related_name_parent: parent, **child}) for child in children]) + def create_multiple_bulk_normalized(notnormalized_instances, model_class): if notnormalized_instances: - return model_class.objects.bulk_create([initialize_normed(notnorm_instance) for notnorm_instance in notnormalized_instances]) + return model_class.objects.bulk_create( + [initialize_normed(notnorm_instance) for notnorm_instance in notnormalized_instances]) -def initialize_normed(notnorm_instance): +def initialize_normed(notnorm_instance): norm = copy.copy(notnorm_instance) norm.pk = None norm.normed = True @@ -145,7 +145,7 @@ def initialize_normed(notnorm_instance): except AttributeError: pass - #interventions have no add statistics because they should have no mean,median,sd,se,cv ... + # interventions have no add statistics because they should have no mean,median,sd,se,cv ... try: norm.add_error_measures() except AttributeError: @@ -153,7 +153,6 @@ def initialize_normed(notnorm_instance): return norm - def recursive_iter(obj, keys=()): """ Creates dictionary with key:object from nested JSON data structure. """ if isinstance(obj, dict): @@ -178,9 +177,8 @@ def set_keys(d, value, *keys): def _validate_requried_key(attrs, key, details=None): - if key not in attrs: error_json = {key: f"{key} is required."} if details: error_json["details"] = details - raise serializers.ValidationError(error_json) \ No newline at end of file + raise serializers.ValidationError(error_json) diff --git a/backend/pkdb_app/views.py b/backend/pkdb_app/views.py index 6e9fe371..b9cd7e5d 100644 --- a/backend/pkdb_app/views.py +++ b/backend/pkdb_app/views.py @@ -2,7 +2,7 @@ Views """ import os -from django.http import HttpResponse, FileResponse,HttpResponseForbidden +from django.http import HttpResponse, FileResponse, HttpResponseForbidden from django.shortcuts import render, get_object_or_404 from pkdb_app.users.permissions import get_study_file_permission, user_group from rest_framework.authtoken.models import Token @@ -36,6 +36,7 @@ def test_500_view(request): from rest_framework.permissions import AllowAny from rest_framework.response import Response + @api_view() @renderer_classes([SwaggerUIRenderer, OpenAPIRenderer, CoreJSONRenderer]) @authentication_classes((SessionAuthentication, BasicAuthentication)) @@ -44,21 +45,23 @@ def schema_view(request): generator = SchemaGenerator(title="PKDB Web API") return Response(generator.get_schema(request=request)) + class CreateListModelMixin(object): def get_serializer(self, *args, **kwargs): """ if an array is passed, set serializer to many """ if isinstance(kwargs.get('data', {}), list): kwargs['many'] = True return super(CreateListModelMixin, self).get_serializer(*args, **kwargs) - #elif kwargs.get('many', False): + # elif kwargs.get('many', False): # new_kwargs['many'] = True # new_kwargs['data'] = kwargs["data"].get("files") # return super(CreateListModelMixin, self).get_serializer(*args, **new_kwargs) -#@authentication_classes((TokenAuthentication,SessionAuthentication)) + +# @authentication_classes((TokenAuthentication,SessionAuthentication)) def serve_protected_document(request, file): try: - user,_ = TokenAuthentication().authenticate(request=request) + user, _ = TokenAuthentication().authenticate(request=request) except TypeError: user = request.user @@ -66,7 +69,7 @@ def serve_protected_document(request, file): try: ref = Reference.objects.get(pdf=file) - if get_study_file_permission(user,ref.study): + if get_study_file_permission(user, ref.study): # Split the elements of the path response = FileResponse(ref.pdf, ) response["Content-Disposition"] = "attachment; filename=" + file_name @@ -80,12 +83,11 @@ def serve_protected_document(request, file): datafile = get_object_or_404(DataFile, file=file) study = datafile.study_set.all()[0] - if get_study_file_permission(user,study): + if get_study_file_permission(user, study): # Split the elements of the path - response = FileResponse(datafile.file,) + response = FileResponse(datafile.file, ) response["Content-Disposition"] = "attachment; filename=" + file_name - return response else: diff --git a/backend/setup.py b/backend/setup.py index 8fe23858..6b8459d4 100644 --- a/backend/setup.py +++ b/backend/setup.py @@ -68,7 +68,7 @@ def read(*names, **kwargs): keywords='pharmacokinetics data', packages=find_packages(), package_data={ - '': ['requirements.txt'], + '': ['requirements.txt'], }, include_package_data=True, zip_safe=False, diff --git a/docker-compose-develop.yml b/docker-compose-develop.yml index a21f213c..7267df07 100644 --- a/docker-compose-develop.yml +++ b/docker-compose-develop.yml @@ -23,7 +23,7 @@ volumes: driver: local node_modules: driver: local - + services: postgres: @@ -60,8 +60,8 @@ services: - postgres:postgres - elasticsearch:elasticsearch depends_on: - - postgres - - elasticsearch + - postgres + - elasticsearch command: bash -c "/usr/local/bin/python manage.py runserver 0.0.0.0:8000" frontend: diff --git a/docker-compose-production.yml b/docker-compose-production.yml index f0bddeb6..8192a70c 100644 --- a/docker-compose-production.yml +++ b/docker-compose-production.yml @@ -23,7 +23,7 @@ volumes: driver: local node_modules: driver: local - + services: postgres: restart: always @@ -61,8 +61,8 @@ services: - postgres:postgres - elasticsearch:elasticsearch depends_on: - - postgres - - elasticsearch + - postgres + - elasticsearch command: bash -c "/usr/local/bin/gunicorn pkdb_app.wsgi:application --log-config gunicorn_logging.conf -w 4 --timeout 120 --bind 0.0.0.0:8000" frontend: diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js index 1c6179f3..5bd125ba 100644 --- a/frontend/.eslintrc.js +++ b/frontend/.eslintrc.js @@ -1,17 +1,17 @@ module.exports = { - root: true, - env: { - node: true - }, - 'extends': [ - 'plugin:vue/essential', - 'eslint:recommended' - ], - rules: { - 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' - }, - parserOptions: { - parser: 'babel-eslint' - } + root: true, + env: { + node: true + }, + 'extends': [ + 'plugin:vue/essential', + 'eslint:recommended' + ], + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + }, + parserOptions: { + parser: 'babel-eslint' + } } diff --git a/frontend/babel.config.js b/frontend/babel.config.js index 932df281..f36e0130 100644 --- a/frontend/babel.config.js +++ b/frontend/babel.config.js @@ -1,10 +1,10 @@ module.exports = { - "presets": [ - [ - "@vue/app", - { - "useBuiltIns": "entry" - } + "presets": [ + [ + "@vue/app", + { + "useBuiltIns": "entry" + } + ] ] - ] } \ No newline at end of file diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js index 961986e2..57b9e1c4 100644 --- a/frontend/postcss.config.js +++ b/frontend/postcss.config.js @@ -1,5 +1,5 @@ module.exports = { - plugins: { - autoprefixer: {} - } + plugins: { + autoprefixer: {} + } } diff --git a/frontend/public/index.html b/frontend/public/index.html index abbfff7f..de7fb6cf 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -1,6 +1,6 @@ - + @@ -11,14 +11,16 @@ - - - - + + + + -
- - +
+ + diff --git a/frontend/src/assets/vuetify.css b/frontend/src/assets/vuetify.css index b6d8722e..f2072891 100644 --- a/frontend/src/assets/vuetify.css +++ b/frontend/src/assets/vuetify.css @@ -1,2207 +1,2760 @@ @-webkit-keyframes shake { - 59% { - margin-left: 0; - } - 60%, 80% { - margin-left: 2px; - } - 70%, 90% { - margin-left: -2px; - } + 59% { + margin-left: 0; + } + 60%, 80% { + margin-left: 2px; + } + 70%, 90% { + margin-left: -2px; + } } + @keyframes shake { - 59% { - margin-left: 0; - } - 60%, 80% { - margin-left: 2px; - } - 70%, 90% { - margin-left: -2px; - } + 59% { + margin-left: 0; + } + 60%, 80% { + margin-left: 2px; + } + 70%, 90% { + margin-left: -2px; + } } + .black { - background-color: #000 !important; - border-color: #000 !important; + background-color: #000 !important; + border-color: #000 !important; } + .black--text { - color: #000 !important; - caret-color: #000 !important; + color: #000 !important; + caret-color: #000 !important; } + .white { - background-color: #fff !important; - border-color: #fff !important; + background-color: #fff !important; + border-color: #fff !important; } + .white--text { - color: #fff !important; - caret-color: #fff !important; + color: #fff !important; + caret-color: #fff !important; } + .transparent { - background-color: transparent !important; - border-color: transparent !important; + background-color: transparent !important; + border-color: transparent !important; } + .transparent--text { - color: transparent !important; - caret-color: transparent !important; + color: transparent !important; + caret-color: transparent !important; } + .red { - background-color: #f44336 !important; - border-color: #f44336 !important; + background-color: #f44336 !important; + border-color: #f44336 !important; } + .red--text { - color: #f44336 !important; - caret-color: #f44336 !important; + color: #f44336 !important; + caret-color: #f44336 !important; } + .red.lighten-5 { - background-color: #ffebee !important; - border-color: #ffebee !important; + background-color: #ffebee !important; + border-color: #ffebee !important; } + .red--text.text--lighten-5 { - color: #ffebee !important; - caret-color: #ffebee !important; + color: #ffebee !important; + caret-color: #ffebee !important; } + .red.lighten-4 { - background-color: #ffcdd2 !important; - border-color: #ffcdd2 !important; + background-color: #ffcdd2 !important; + border-color: #ffcdd2 !important; } + .red--text.text--lighten-4 { - color: #ffcdd2 !important; - caret-color: #ffcdd2 !important; + color: #ffcdd2 !important; + caret-color: #ffcdd2 !important; } + .red.lighten-3 { - background-color: #ef9a9a !important; - border-color: #ef9a9a !important; + background-color: #ef9a9a !important; + border-color: #ef9a9a !important; } + .red--text.text--lighten-3 { - color: #ef9a9a !important; - caret-color: #ef9a9a !important; + color: #ef9a9a !important; + caret-color: #ef9a9a !important; } + .red.lighten-2 { - background-color: #e57373 !important; - border-color: #e57373 !important; + background-color: #e57373 !important; + border-color: #e57373 !important; } + .red--text.text--lighten-2 { - color: #e57373 !important; - caret-color: #e57373 !important; + color: #e57373 !important; + caret-color: #e57373 !important; } + .red.lighten-1 { - background-color: #ef5350 !important; - border-color: #ef5350 !important; + background-color: #ef5350 !important; + border-color: #ef5350 !important; } + .red--text.text--lighten-1 { - color: #ef5350 !important; - caret-color: #ef5350 !important; + color: #ef5350 !important; + caret-color: #ef5350 !important; } + .red.darken-1 { - background-color: #e53935 !important; - border-color: #e53935 !important; + background-color: #e53935 !important; + border-color: #e53935 !important; } + .red--text.text--darken-1 { - color: #e53935 !important; - caret-color: #e53935 !important; + color: #e53935 !important; + caret-color: #e53935 !important; } + .red.darken-2 { - background-color: #d32f2f !important; - border-color: #d32f2f !important; + background-color: #d32f2f !important; + border-color: #d32f2f !important; } + .red--text.text--darken-2 { - color: #d32f2f !important; - caret-color: #d32f2f !important; + color: #d32f2f !important; + caret-color: #d32f2f !important; } + .red.darken-3 { - background-color: #c62828 !important; - border-color: #c62828 !important; + background-color: #c62828 !important; + border-color: #c62828 !important; } + .red--text.text--darken-3 { - color: #c62828 !important; - caret-color: #c62828 !important; + color: #c62828 !important; + caret-color: #c62828 !important; } + .red.darken-4 { - background-color: #b71c1c !important; - border-color: #b71c1c !important; + background-color: #b71c1c !important; + border-color: #b71c1c !important; } + .red--text.text--darken-4 { - color: #b71c1c !important; - caret-color: #b71c1c !important; + color: #b71c1c !important; + caret-color: #b71c1c !important; } + .red.accent-1 { - background-color: #ff8a80 !important; - border-color: #ff8a80 !important; + background-color: #ff8a80 !important; + border-color: #ff8a80 !important; } + .red--text.text--accent-1 { - color: #ff8a80 !important; - caret-color: #ff8a80 !important; + color: #ff8a80 !important; + caret-color: #ff8a80 !important; } + .red.accent-2 { - background-color: #ff5252 !important; - border-color: #ff5252 !important; + background-color: #ff5252 !important; + border-color: #ff5252 !important; } + .red--text.text--accent-2 { - color: #ff5252 !important; - caret-color: #ff5252 !important; + color: #ff5252 !important; + caret-color: #ff5252 !important; } + .red.accent-3 { - background-color: #ff1744 !important; - border-color: #ff1744 !important; + background-color: #ff1744 !important; + border-color: #ff1744 !important; } + .red--text.text--accent-3 { - color: #ff1744 !important; - caret-color: #ff1744 !important; + color: #ff1744 !important; + caret-color: #ff1744 !important; } + .red.accent-4 { - background-color: #d50000 !important; - border-color: #d50000 !important; + background-color: #d50000 !important; + border-color: #d50000 !important; } + .red--text.text--accent-4 { - color: #d50000 !important; - caret-color: #d50000 !important; + color: #d50000 !important; + caret-color: #d50000 !important; } + .pink { - background-color: #e91e63 !important; - border-color: #e91e63 !important; + background-color: #e91e63 !important; + border-color: #e91e63 !important; } + .pink--text { - color: #e91e63 !important; - caret-color: #e91e63 !important; + color: #e91e63 !important; + caret-color: #e91e63 !important; } + .pink.lighten-5 { - background-color: #fce4ec !important; - border-color: #fce4ec !important; + background-color: #fce4ec !important; + border-color: #fce4ec !important; } + .pink--text.text--lighten-5 { - color: #fce4ec !important; - caret-color: #fce4ec !important; + color: #fce4ec !important; + caret-color: #fce4ec !important; } + .pink.lighten-4 { - background-color: #f8bbd0 !important; - border-color: #f8bbd0 !important; + background-color: #f8bbd0 !important; + border-color: #f8bbd0 !important; } + .pink--text.text--lighten-4 { - color: #f8bbd0 !important; - caret-color: #f8bbd0 !important; + color: #f8bbd0 !important; + caret-color: #f8bbd0 !important; } + .pink.lighten-3 { - background-color: #f48fb1 !important; - border-color: #f48fb1 !important; + background-color: #f48fb1 !important; + border-color: #f48fb1 !important; } + .pink--text.text--lighten-3 { - color: #f48fb1 !important; - caret-color: #f48fb1 !important; + color: #f48fb1 !important; + caret-color: #f48fb1 !important; } + .pink.lighten-2 { - background-color: #f06292 !important; - border-color: #f06292 !important; + background-color: #f06292 !important; + border-color: #f06292 !important; } + .pink--text.text--lighten-2 { - color: #f06292 !important; - caret-color: #f06292 !important; + color: #f06292 !important; + caret-color: #f06292 !important; } + .pink.lighten-1 { - background-color: #ec407a !important; - border-color: #ec407a !important; + background-color: #ec407a !important; + border-color: #ec407a !important; } + .pink--text.text--lighten-1 { - color: #ec407a !important; - caret-color: #ec407a !important; + color: #ec407a !important; + caret-color: #ec407a !important; } + .pink.darken-1 { - background-color: #d81b60 !important; - border-color: #d81b60 !important; + background-color: #d81b60 !important; + border-color: #d81b60 !important; } + .pink--text.text--darken-1 { - color: #d81b60 !important; - caret-color: #d81b60 !important; + color: #d81b60 !important; + caret-color: #d81b60 !important; } + .pink.darken-2 { - background-color: #c2185b !important; - border-color: #c2185b !important; + background-color: #c2185b !important; + border-color: #c2185b !important; } + .pink--text.text--darken-2 { - color: #c2185b !important; - caret-color: #c2185b !important; + color: #c2185b !important; + caret-color: #c2185b !important; } + .pink.darken-3 { - background-color: #ad1457 !important; - border-color: #ad1457 !important; + background-color: #ad1457 !important; + border-color: #ad1457 !important; } + .pink--text.text--darken-3 { - color: #ad1457 !important; - caret-color: #ad1457 !important; + color: #ad1457 !important; + caret-color: #ad1457 !important; } + .pink.darken-4 { - background-color: #880e4f !important; - border-color: #880e4f !important; + background-color: #880e4f !important; + border-color: #880e4f !important; } + .pink--text.text--darken-4 { - color: #880e4f !important; - caret-color: #880e4f !important; + color: #880e4f !important; + caret-color: #880e4f !important; } + .pink.accent-1 { - background-color: #ff80ab !important; - border-color: #ff80ab !important; + background-color: #ff80ab !important; + border-color: #ff80ab !important; } + .pink--text.text--accent-1 { - color: #ff80ab !important; - caret-color: #ff80ab !important; + color: #ff80ab !important; + caret-color: #ff80ab !important; } + .pink.accent-2 { - background-color: #ff4081 !important; - border-color: #ff4081 !important; + background-color: #ff4081 !important; + border-color: #ff4081 !important; } + .pink--text.text--accent-2 { - color: #ff4081 !important; - caret-color: #ff4081 !important; + color: #ff4081 !important; + caret-color: #ff4081 !important; } + .pink.accent-3 { - background-color: #f50057 !important; - border-color: #f50057 !important; + background-color: #f50057 !important; + border-color: #f50057 !important; } + .pink--text.text--accent-3 { - color: #f50057 !important; - caret-color: #f50057 !important; + color: #f50057 !important; + caret-color: #f50057 !important; } + .pink.accent-4 { - background-color: #c51162 !important; - border-color: #c51162 !important; + background-color: #c51162 !important; + border-color: #c51162 !important; } + .pink--text.text--accent-4 { - color: #c51162 !important; - caret-color: #c51162 !important; + color: #c51162 !important; + caret-color: #c51162 !important; } + .purple { - background-color: #9c27b0 !important; - border-color: #9c27b0 !important; + background-color: #9c27b0 !important; + border-color: #9c27b0 !important; } + .purple--text { - color: #9c27b0 !important; - caret-color: #9c27b0 !important; + color: #9c27b0 !important; + caret-color: #9c27b0 !important; } + .purple.lighten-5 { - background-color: #f3e5f5 !important; - border-color: #f3e5f5 !important; + background-color: #f3e5f5 !important; + border-color: #f3e5f5 !important; } + .purple--text.text--lighten-5 { - color: #f3e5f5 !important; - caret-color: #f3e5f5 !important; + color: #f3e5f5 !important; + caret-color: #f3e5f5 !important; } + .purple.lighten-4 { - background-color: #e1bee7 !important; - border-color: #e1bee7 !important; + background-color: #e1bee7 !important; + border-color: #e1bee7 !important; } + .purple--text.text--lighten-4 { - color: #e1bee7 !important; - caret-color: #e1bee7 !important; + color: #e1bee7 !important; + caret-color: #e1bee7 !important; } + .purple.lighten-3 { - background-color: #ce93d8 !important; - border-color: #ce93d8 !important; + background-color: #ce93d8 !important; + border-color: #ce93d8 !important; } + .purple--text.text--lighten-3 { - color: #ce93d8 !important; - caret-color: #ce93d8 !important; + color: #ce93d8 !important; + caret-color: #ce93d8 !important; } + .purple.lighten-2 { - background-color: #ba68c8 !important; - border-color: #ba68c8 !important; + background-color: #ba68c8 !important; + border-color: #ba68c8 !important; } + .purple--text.text--lighten-2 { - color: #ba68c8 !important; - caret-color: #ba68c8 !important; + color: #ba68c8 !important; + caret-color: #ba68c8 !important; } + .purple.lighten-1 { - background-color: #ab47bc !important; - border-color: #ab47bc !important; + background-color: #ab47bc !important; + border-color: #ab47bc !important; } + .purple--text.text--lighten-1 { - color: #ab47bc !important; - caret-color: #ab47bc !important; + color: #ab47bc !important; + caret-color: #ab47bc !important; } + .purple.darken-1 { - background-color: #8e24aa !important; - border-color: #8e24aa !important; + background-color: #8e24aa !important; + border-color: #8e24aa !important; } + .purple--text.text--darken-1 { - color: #8e24aa !important; - caret-color: #8e24aa !important; + color: #8e24aa !important; + caret-color: #8e24aa !important; } + .purple.darken-2 { - background-color: #7b1fa2 !important; - border-color: #7b1fa2 !important; + background-color: #7b1fa2 !important; + border-color: #7b1fa2 !important; } + .purple--text.text--darken-2 { - color: #7b1fa2 !important; - caret-color: #7b1fa2 !important; + color: #7b1fa2 !important; + caret-color: #7b1fa2 !important; } + .purple.darken-3 { - background-color: #6a1b9a !important; - border-color: #6a1b9a !important; + background-color: #6a1b9a !important; + border-color: #6a1b9a !important; } + .purple--text.text--darken-3 { - color: #6a1b9a !important; - caret-color: #6a1b9a !important; + color: #6a1b9a !important; + caret-color: #6a1b9a !important; } + .purple.darken-4 { - background-color: #4a148c !important; - border-color: #4a148c !important; + background-color: #4a148c !important; + border-color: #4a148c !important; } + .purple--text.text--darken-4 { - color: #4a148c !important; - caret-color: #4a148c !important; + color: #4a148c !important; + caret-color: #4a148c !important; } + .purple.accent-1 { - background-color: #ea80fc !important; - border-color: #ea80fc !important; + background-color: #ea80fc !important; + border-color: #ea80fc !important; } + .purple--text.text--accent-1 { - color: #ea80fc !important; - caret-color: #ea80fc !important; + color: #ea80fc !important; + caret-color: #ea80fc !important; } + .purple.accent-2 { - background-color: #e040fb !important; - border-color: #e040fb !important; + background-color: #e040fb !important; + border-color: #e040fb !important; } + .purple--text.text--accent-2 { - color: #e040fb !important; - caret-color: #e040fb !important; + color: #e040fb !important; + caret-color: #e040fb !important; } + .purple.accent-3 { - background-color: #d500f9 !important; - border-color: #d500f9 !important; + background-color: #d500f9 !important; + border-color: #d500f9 !important; } + .purple--text.text--accent-3 { - color: #d500f9 !important; - caret-color: #d500f9 !important; + color: #d500f9 !important; + caret-color: #d500f9 !important; } + .purple.accent-4 { - background-color: #a0f !important; - border-color: #a0f !important; + background-color: #a0f !important; + border-color: #a0f !important; } + .purple--text.text--accent-4 { - color: #a0f !important; - caret-color: #a0f !important; + color: #a0f !important; + caret-color: #a0f !important; } + .deep-purple { - background-color: #673ab7 !important; - border-color: #673ab7 !important; + background-color: #673ab7 !important; + border-color: #673ab7 !important; } + .deep-purple--text { - color: #673ab7 !important; - caret-color: #673ab7 !important; + color: #673ab7 !important; + caret-color: #673ab7 !important; } + .deep-purple.lighten-5 { - background-color: #ede7f6 !important; - border-color: #ede7f6 !important; + background-color: #ede7f6 !important; + border-color: #ede7f6 !important; } + .deep-purple--text.text--lighten-5 { - color: #ede7f6 !important; - caret-color: #ede7f6 !important; + color: #ede7f6 !important; + caret-color: #ede7f6 !important; } + .deep-purple.lighten-4 { - background-color: #d1c4e9 !important; - border-color: #d1c4e9 !important; + background-color: #d1c4e9 !important; + border-color: #d1c4e9 !important; } + .deep-purple--text.text--lighten-4 { - color: #d1c4e9 !important; - caret-color: #d1c4e9 !important; + color: #d1c4e9 !important; + caret-color: #d1c4e9 !important; } + .deep-purple.lighten-3 { - background-color: #b39ddb !important; - border-color: #b39ddb !important; + background-color: #b39ddb !important; + border-color: #b39ddb !important; } + .deep-purple--text.text--lighten-3 { - color: #b39ddb !important; - caret-color: #b39ddb !important; + color: #b39ddb !important; + caret-color: #b39ddb !important; } + .deep-purple.lighten-2 { - background-color: #9575cd !important; - border-color: #9575cd !important; + background-color: #9575cd !important; + border-color: #9575cd !important; } + .deep-purple--text.text--lighten-2 { - color: #9575cd !important; - caret-color: #9575cd !important; + color: #9575cd !important; + caret-color: #9575cd !important; } + .deep-purple.lighten-1 { - background-color: #7e57c2 !important; - border-color: #7e57c2 !important; + background-color: #7e57c2 !important; + border-color: #7e57c2 !important; } + .deep-purple--text.text--lighten-1 { - color: #7e57c2 !important; - caret-color: #7e57c2 !important; + color: #7e57c2 !important; + caret-color: #7e57c2 !important; } + .deep-purple.darken-1 { - background-color: #5e35b1 !important; - border-color: #5e35b1 !important; + background-color: #5e35b1 !important; + border-color: #5e35b1 !important; } + .deep-purple--text.text--darken-1 { - color: #5e35b1 !important; - caret-color: #5e35b1 !important; + color: #5e35b1 !important; + caret-color: #5e35b1 !important; } + .deep-purple.darken-2 { - background-color: #512da8 !important; - border-color: #512da8 !important; + background-color: #512da8 !important; + border-color: #512da8 !important; } + .deep-purple--text.text--darken-2 { - color: #512da8 !important; - caret-color: #512da8 !important; + color: #512da8 !important; + caret-color: #512da8 !important; } + .deep-purple.darken-3 { - background-color: #4527a0 !important; - border-color: #4527a0 !important; + background-color: #4527a0 !important; + border-color: #4527a0 !important; } + .deep-purple--text.text--darken-3 { - color: #4527a0 !important; - caret-color: #4527a0 !important; + color: #4527a0 !important; + caret-color: #4527a0 !important; } + .deep-purple.darken-4 { - background-color: #311b92 !important; - border-color: #311b92 !important; + background-color: #311b92 !important; + border-color: #311b92 !important; } + .deep-purple--text.text--darken-4 { - color: #311b92 !important; - caret-color: #311b92 !important; + color: #311b92 !important; + caret-color: #311b92 !important; } + .deep-purple.accent-1 { - background-color: #b388ff !important; - border-color: #b388ff !important; + background-color: #b388ff !important; + border-color: #b388ff !important; } + .deep-purple--text.text--accent-1 { - color: #b388ff !important; - caret-color: #b388ff !important; + color: #b388ff !important; + caret-color: #b388ff !important; } + .deep-purple.accent-2 { - background-color: #7c4dff !important; - border-color: #7c4dff !important; + background-color: #7c4dff !important; + border-color: #7c4dff !important; } + .deep-purple--text.text--accent-2 { - color: #7c4dff !important; - caret-color: #7c4dff !important; + color: #7c4dff !important; + caret-color: #7c4dff !important; } + .deep-purple.accent-3 { - background-color: #651fff !important; - border-color: #651fff !important; + background-color: #651fff !important; + border-color: #651fff !important; } + .deep-purple--text.text--accent-3 { - color: #651fff !important; - caret-color: #651fff !important; + color: #651fff !important; + caret-color: #651fff !important; } + .deep-purple.accent-4 { - background-color: #6200ea !important; - border-color: #6200ea !important; + background-color: #6200ea !important; + border-color: #6200ea !important; } + .deep-purple--text.text--accent-4 { - color: #6200ea !important; - caret-color: #6200ea !important; + color: #6200ea !important; + caret-color: #6200ea !important; } + .indigo { - background-color: #3f51b5 !important; - border-color: #3f51b5 !important; + background-color: #3f51b5 !important; + border-color: #3f51b5 !important; } + .indigo--text { - color: #3f51b5 !important; - caret-color: #3f51b5 !important; + color: #3f51b5 !important; + caret-color: #3f51b5 !important; } + .indigo.lighten-5 { - background-color: #e8eaf6 !important; - border-color: #e8eaf6 !important; + background-color: #e8eaf6 !important; + border-color: #e8eaf6 !important; } + .indigo--text.text--lighten-5 { - color: #e8eaf6 !important; - caret-color: #e8eaf6 !important; + color: #e8eaf6 !important; + caret-color: #e8eaf6 !important; } + .indigo.lighten-4 { - background-color: #c5cae9 !important; - border-color: #c5cae9 !important; + background-color: #c5cae9 !important; + border-color: #c5cae9 !important; } + .indigo--text.text--lighten-4 { - color: #c5cae9 !important; - caret-color: #c5cae9 !important; + color: #c5cae9 !important; + caret-color: #c5cae9 !important; } + .indigo.lighten-3 { - background-color: #9fa8da !important; - border-color: #9fa8da !important; + background-color: #9fa8da !important; + border-color: #9fa8da !important; } + .indigo--text.text--lighten-3 { - color: #9fa8da !important; - caret-color: #9fa8da !important; + color: #9fa8da !important; + caret-color: #9fa8da !important; } + .indigo.lighten-2 { - background-color: #7986cb !important; - border-color: #7986cb !important; + background-color: #7986cb !important; + border-color: #7986cb !important; } + .indigo--text.text--lighten-2 { - color: #7986cb !important; - caret-color: #7986cb !important; + color: #7986cb !important; + caret-color: #7986cb !important; } + .indigo.lighten-1 { - background-color: #5c6bc0 !important; - border-color: #5c6bc0 !important; + background-color: #5c6bc0 !important; + border-color: #5c6bc0 !important; } + .indigo--text.text--lighten-1 { - color: #5c6bc0 !important; - caret-color: #5c6bc0 !important; + color: #5c6bc0 !important; + caret-color: #5c6bc0 !important; } + .indigo.darken-1 { - background-color: #3949ab !important; - border-color: #3949ab !important; + background-color: #3949ab !important; + border-color: #3949ab !important; } + .indigo--text.text--darken-1 { - color: #3949ab !important; - caret-color: #3949ab !important; + color: #3949ab !important; + caret-color: #3949ab !important; } + .indigo.darken-2 { - background-color: #303f9f !important; - border-color: #303f9f !important; + background-color: #303f9f !important; + border-color: #303f9f !important; } + .indigo--text.text--darken-2 { - color: #303f9f !important; - caret-color: #303f9f !important; + color: #303f9f !important; + caret-color: #303f9f !important; } + .indigo.darken-3 { - background-color: #283593 !important; - border-color: #283593 !important; + background-color: #283593 !important; + border-color: #283593 !important; } + .indigo--text.text--darken-3 { - color: #283593 !important; - caret-color: #283593 !important; + color: #283593 !important; + caret-color: #283593 !important; } + .indigo.darken-4 { - background-color: #1a237e !important; - border-color: #1a237e !important; + background-color: #1a237e !important; + border-color: #1a237e !important; } + .indigo--text.text--darken-4 { - color: #1a237e !important; - caret-color: #1a237e !important; + color: #1a237e !important; + caret-color: #1a237e !important; } + .indigo.accent-1 { - background-color: #8c9eff !important; - border-color: #8c9eff !important; + background-color: #8c9eff !important; + border-color: #8c9eff !important; } + .indigo--text.text--accent-1 { - color: #8c9eff !important; - caret-color: #8c9eff !important; + color: #8c9eff !important; + caret-color: #8c9eff !important; } + .indigo.accent-2 { - background-color: #536dfe !important; - border-color: #536dfe !important; + background-color: #536dfe !important; + border-color: #536dfe !important; } + .indigo--text.text--accent-2 { - color: #536dfe !important; - caret-color: #536dfe !important; + color: #536dfe !important; + caret-color: #536dfe !important; } + .indigo.accent-3 { - background-color: #3d5afe !important; - border-color: #3d5afe !important; + background-color: #3d5afe !important; + border-color: #3d5afe !important; } + .indigo--text.text--accent-3 { - color: #3d5afe !important; - caret-color: #3d5afe !important; + color: #3d5afe !important; + caret-color: #3d5afe !important; } + .indigo.accent-4 { - background-color: #304ffe !important; - border-color: #304ffe !important; + background-color: #304ffe !important; + border-color: #304ffe !important; } + .indigo--text.text--accent-4 { - color: #304ffe !important; - caret-color: #304ffe !important; + color: #304ffe !important; + caret-color: #304ffe !important; } + .blue { - background-color: #2196f3 !important; - border-color: #2196f3 !important; + background-color: #2196f3 !important; + border-color: #2196f3 !important; } + .blue--text { - color: #2196f3 !important; - caret-color: #2196f3 !important; + color: #2196f3 !important; + caret-color: #2196f3 !important; } + .blue.lighten-5 { - background-color: #e3f2fd !important; - border-color: #e3f2fd !important; + background-color: #e3f2fd !important; + border-color: #e3f2fd !important; } + .blue--text.text--lighten-5 { - color: #e3f2fd !important; - caret-color: #e3f2fd !important; + color: #e3f2fd !important; + caret-color: #e3f2fd !important; } + .blue.lighten-4 { - background-color: #bbdefb !important; - border-color: #bbdefb !important; + background-color: #bbdefb !important; + border-color: #bbdefb !important; } + .blue--text.text--lighten-4 { - color: #bbdefb !important; - caret-color: #bbdefb !important; + color: #bbdefb !important; + caret-color: #bbdefb !important; } + .blue.lighten-3 { - background-color: #90caf9 !important; - border-color: #90caf9 !important; + background-color: #90caf9 !important; + border-color: #90caf9 !important; } + .blue--text.text--lighten-3 { - color: #90caf9 !important; - caret-color: #90caf9 !important; + color: #90caf9 !important; + caret-color: #90caf9 !important; } + .blue.lighten-2 { - background-color: #64b5f6 !important; - border-color: #64b5f6 !important; + background-color: #64b5f6 !important; + border-color: #64b5f6 !important; } + .blue--text.text--lighten-2 { - color: #64b5f6 !important; - caret-color: #64b5f6 !important; + color: #64b5f6 !important; + caret-color: #64b5f6 !important; } + .blue.lighten-1 { - background-color: #42a5f5 !important; - border-color: #42a5f5 !important; + background-color: #42a5f5 !important; + border-color: #42a5f5 !important; } + .blue--text.text--lighten-1 { - color: #42a5f5 !important; - caret-color: #42a5f5 !important; + color: #42a5f5 !important; + caret-color: #42a5f5 !important; } + .blue.darken-1 { - background-color: #1e88e5 !important; - border-color: #1e88e5 !important; + background-color: #1e88e5 !important; + border-color: #1e88e5 !important; } + .blue--text.text--darken-1 { - color: #1e88e5 !important; - caret-color: #1e88e5 !important; + color: #1e88e5 !important; + caret-color: #1e88e5 !important; } + .blue.darken-2 { - background-color: #1976d2 !important; - border-color: #1976d2 !important; + background-color: #1976d2 !important; + border-color: #1976d2 !important; } + .blue--text.text--darken-2 { - color: #1976d2 !important; - caret-color: #1976d2 !important; + color: #1976d2 !important; + caret-color: #1976d2 !important; } + .blue.darken-3 { - background-color: #1565c0 !important; - border-color: #1565c0 !important; + background-color: #1565c0 !important; + border-color: #1565c0 !important; } + .blue--text.text--darken-3 { - color: #1565c0 !important; - caret-color: #1565c0 !important; + color: #1565c0 !important; + caret-color: #1565c0 !important; } + .blue.darken-4 { - background-color: #0d47a1 !important; - border-color: #0d47a1 !important; + background-color: #0d47a1 !important; + border-color: #0d47a1 !important; } + .blue--text.text--darken-4 { - color: #0d47a1 !important; - caret-color: #0d47a1 !important; + color: #0d47a1 !important; + caret-color: #0d47a1 !important; } + .blue.accent-1 { - background-color: #82b1ff !important; - border-color: #82b1ff !important; + background-color: #82b1ff !important; + border-color: #82b1ff !important; } + .blue--text.text--accent-1 { - color: #82b1ff !important; - caret-color: #82b1ff !important; + color: #82b1ff !important; + caret-color: #82b1ff !important; } + .blue.accent-2 { - background-color: #448aff !important; - border-color: #448aff !important; + background-color: #448aff !important; + border-color: #448aff !important; } + .blue--text.text--accent-2 { - color: #448aff !important; - caret-color: #448aff !important; + color: #448aff !important; + caret-color: #448aff !important; } + .blue.accent-3 { - background-color: #2979ff !important; - border-color: #2979ff !important; + background-color: #2979ff !important; + border-color: #2979ff !important; } + .blue--text.text--accent-3 { - color: #2979ff !important; - caret-color: #2979ff !important; + color: #2979ff !important; + caret-color: #2979ff !important; } + .blue.accent-4 { - background-color: #2962ff !important; - border-color: #2962ff !important; + background-color: #2962ff !important; + border-color: #2962ff !important; } + .blue--text.text--accent-4 { - color: #2962ff !important; - caret-color: #2962ff !important; + color: #2962ff !important; + caret-color: #2962ff !important; } + .light-blue { - background-color: #03a9f4 !important; - border-color: #03a9f4 !important; + background-color: #03a9f4 !important; + border-color: #03a9f4 !important; } + .light-blue--text { - color: #03a9f4 !important; - caret-color: #03a9f4 !important; + color: #03a9f4 !important; + caret-color: #03a9f4 !important; } + .light-blue.lighten-5 { - background-color: #e1f5fe !important; - border-color: #e1f5fe !important; + background-color: #e1f5fe !important; + border-color: #e1f5fe !important; } + .light-blue--text.text--lighten-5 { - color: #e1f5fe !important; - caret-color: #e1f5fe !important; + color: #e1f5fe !important; + caret-color: #e1f5fe !important; } + .light-blue.lighten-4 { - background-color: #b3e5fc !important; - border-color: #b3e5fc !important; + background-color: #b3e5fc !important; + border-color: #b3e5fc !important; } + .light-blue--text.text--lighten-4 { - color: #b3e5fc !important; - caret-color: #b3e5fc !important; + color: #b3e5fc !important; + caret-color: #b3e5fc !important; } + .light-blue.lighten-3 { - background-color: #81d4fa !important; - border-color: #81d4fa !important; + background-color: #81d4fa !important; + border-color: #81d4fa !important; } + .light-blue--text.text--lighten-3 { - color: #81d4fa !important; - caret-color: #81d4fa !important; + color: #81d4fa !important; + caret-color: #81d4fa !important; } + .light-blue.lighten-2 { - background-color: #4fc3f7 !important; - border-color: #4fc3f7 !important; + background-color: #4fc3f7 !important; + border-color: #4fc3f7 !important; } + .light-blue--text.text--lighten-2 { - color: #4fc3f7 !important; - caret-color: #4fc3f7 !important; + color: #4fc3f7 !important; + caret-color: #4fc3f7 !important; } + .light-blue.lighten-1 { - background-color: #29b6f6 !important; - border-color: #29b6f6 !important; + background-color: #29b6f6 !important; + border-color: #29b6f6 !important; } + .light-blue--text.text--lighten-1 { - color: #29b6f6 !important; - caret-color: #29b6f6 !important; + color: #29b6f6 !important; + caret-color: #29b6f6 !important; } + .light-blue.darken-1 { - background-color: #039be5 !important; - border-color: #039be5 !important; + background-color: #039be5 !important; + border-color: #039be5 !important; } + .light-blue--text.text--darken-1 { - color: #039be5 !important; - caret-color: #039be5 !important; + color: #039be5 !important; + caret-color: #039be5 !important; } + .light-blue.darken-2 { - background-color: #0288d1 !important; - border-color: #0288d1 !important; + background-color: #0288d1 !important; + border-color: #0288d1 !important; } + .light-blue--text.text--darken-2 { - color: #0288d1 !important; - caret-color: #0288d1 !important; + color: #0288d1 !important; + caret-color: #0288d1 !important; } + .light-blue.darken-3 { - background-color: #0277bd !important; - border-color: #0277bd !important; + background-color: #0277bd !important; + border-color: #0277bd !important; } + .light-blue--text.text--darken-3 { - color: #0277bd !important; - caret-color: #0277bd !important; + color: #0277bd !important; + caret-color: #0277bd !important; } + .light-blue.darken-4 { - background-color: #01579b !important; - border-color: #01579b !important; + background-color: #01579b !important; + border-color: #01579b !important; } + .light-blue--text.text--darken-4 { - color: #01579b !important; - caret-color: #01579b !important; + color: #01579b !important; + caret-color: #01579b !important; } + .light-blue.accent-1 { - background-color: #80d8ff !important; - border-color: #80d8ff !important; + background-color: #80d8ff !important; + border-color: #80d8ff !important; } + .light-blue--text.text--accent-1 { - color: #80d8ff !important; - caret-color: #80d8ff !important; + color: #80d8ff !important; + caret-color: #80d8ff !important; } + .light-blue.accent-2 { - background-color: #40c4ff !important; - border-color: #40c4ff !important; + background-color: #40c4ff !important; + border-color: #40c4ff !important; } + .light-blue--text.text--accent-2 { - color: #40c4ff !important; - caret-color: #40c4ff !important; + color: #40c4ff !important; + caret-color: #40c4ff !important; } + .light-blue.accent-3 { - background-color: #00b0ff !important; - border-color: #00b0ff !important; + background-color: #00b0ff !important; + border-color: #00b0ff !important; } + .light-blue--text.text--accent-3 { - color: #00b0ff !important; - caret-color: #00b0ff !important; + color: #00b0ff !important; + caret-color: #00b0ff !important; } + .light-blue.accent-4 { - background-color: #0091ea !important; - border-color: #0091ea !important; + background-color: #0091ea !important; + border-color: #0091ea !important; } + .light-blue--text.text--accent-4 { - color: #0091ea !important; - caret-color: #0091ea !important; + color: #0091ea !important; + caret-color: #0091ea !important; } + .cyan { - background-color: #00bcd4 !important; - border-color: #00bcd4 !important; + background-color: #00bcd4 !important; + border-color: #00bcd4 !important; } + .cyan--text { - color: #00bcd4 !important; - caret-color: #00bcd4 !important; + color: #00bcd4 !important; + caret-color: #00bcd4 !important; } + .cyan.lighten-5 { - background-color: #e0f7fa !important; - border-color: #e0f7fa !important; + background-color: #e0f7fa !important; + border-color: #e0f7fa !important; } + .cyan--text.text--lighten-5 { - color: #e0f7fa !important; - caret-color: #e0f7fa !important; + color: #e0f7fa !important; + caret-color: #e0f7fa !important; } + .cyan.lighten-4 { - background-color: #b2ebf2 !important; - border-color: #b2ebf2 !important; + background-color: #b2ebf2 !important; + border-color: #b2ebf2 !important; } + .cyan--text.text--lighten-4 { - color: #b2ebf2 !important; - caret-color: #b2ebf2 !important; + color: #b2ebf2 !important; + caret-color: #b2ebf2 !important; } + .cyan.lighten-3 { - background-color: #80deea !important; - border-color: #80deea !important; + background-color: #80deea !important; + border-color: #80deea !important; } + .cyan--text.text--lighten-3 { - color: #80deea !important; - caret-color: #80deea !important; + color: #80deea !important; + caret-color: #80deea !important; } + .cyan.lighten-2 { - background-color: #4dd0e1 !important; - border-color: #4dd0e1 !important; + background-color: #4dd0e1 !important; + border-color: #4dd0e1 !important; } + .cyan--text.text--lighten-2 { - color: #4dd0e1 !important; - caret-color: #4dd0e1 !important; + color: #4dd0e1 !important; + caret-color: #4dd0e1 !important; } + .cyan.lighten-1 { - background-color: #26c6da !important; - border-color: #26c6da !important; + background-color: #26c6da !important; + border-color: #26c6da !important; } + .cyan--text.text--lighten-1 { - color: #26c6da !important; - caret-color: #26c6da !important; + color: #26c6da !important; + caret-color: #26c6da !important; } + .cyan.darken-1 { - background-color: #00acc1 !important; - border-color: #00acc1 !important; + background-color: #00acc1 !important; + border-color: #00acc1 !important; } + .cyan--text.text--darken-1 { - color: #00acc1 !important; - caret-color: #00acc1 !important; + color: #00acc1 !important; + caret-color: #00acc1 !important; } + .cyan.darken-2 { - background-color: #0097a7 !important; - border-color: #0097a7 !important; + background-color: #0097a7 !important; + border-color: #0097a7 !important; } + .cyan--text.text--darken-2 { - color: #0097a7 !important; - caret-color: #0097a7 !important; + color: #0097a7 !important; + caret-color: #0097a7 !important; } + .cyan.darken-3 { - background-color: #00838f !important; - border-color: #00838f !important; + background-color: #00838f !important; + border-color: #00838f !important; } + .cyan--text.text--darken-3 { - color: #00838f !important; - caret-color: #00838f !important; + color: #00838f !important; + caret-color: #00838f !important; } + .cyan.darken-4 { - background-color: #006064 !important; - border-color: #006064 !important; + background-color: #006064 !important; + border-color: #006064 !important; } + .cyan--text.text--darken-4 { - color: #006064 !important; - caret-color: #006064 !important; + color: #006064 !important; + caret-color: #006064 !important; } + .cyan.accent-1 { - background-color: #84ffff !important; - border-color: #84ffff !important; + background-color: #84ffff !important; + border-color: #84ffff !important; } + .cyan--text.text--accent-1 { - color: #84ffff !important; - caret-color: #84ffff !important; + color: #84ffff !important; + caret-color: #84ffff !important; } + .cyan.accent-2 { - background-color: #18ffff !important; - border-color: #18ffff !important; + background-color: #18ffff !important; + border-color: #18ffff !important; } + .cyan--text.text--accent-2 { - color: #18ffff !important; - caret-color: #18ffff !important; + color: #18ffff !important; + caret-color: #18ffff !important; } + .cyan.accent-3 { - background-color: #00e5ff !important; - border-color: #00e5ff !important; + background-color: #00e5ff !important; + border-color: #00e5ff !important; } + .cyan--text.text--accent-3 { - color: #00e5ff !important; - caret-color: #00e5ff !important; + color: #00e5ff !important; + caret-color: #00e5ff !important; } + .cyan.accent-4 { - background-color: #00b8d4 !important; - border-color: #00b8d4 !important; + background-color: #00b8d4 !important; + border-color: #00b8d4 !important; } + .cyan--text.text--accent-4 { - color: #00b8d4 !important; - caret-color: #00b8d4 !important; + color: #00b8d4 !important; + caret-color: #00b8d4 !important; } + .teal { - background-color: #009688 !important; - border-color: #009688 !important; + background-color: #009688 !important; + border-color: #009688 !important; } + .teal--text { - color: #009688 !important; - caret-color: #009688 !important; + color: #009688 !important; + caret-color: #009688 !important; } + .teal.lighten-5 { - background-color: #e0f2f1 !important; - border-color: #e0f2f1 !important; + background-color: #e0f2f1 !important; + border-color: #e0f2f1 !important; } + .teal--text.text--lighten-5 { - color: #e0f2f1 !important; - caret-color: #e0f2f1 !important; + color: #e0f2f1 !important; + caret-color: #e0f2f1 !important; } + .teal.lighten-4 { - background-color: #b2dfdb !important; - border-color: #b2dfdb !important; + background-color: #b2dfdb !important; + border-color: #b2dfdb !important; } + .teal--text.text--lighten-4 { - color: #b2dfdb !important; - caret-color: #b2dfdb !important; + color: #b2dfdb !important; + caret-color: #b2dfdb !important; } + .teal.lighten-3 { - background-color: #80cbc4 !important; - border-color: #80cbc4 !important; + background-color: #80cbc4 !important; + border-color: #80cbc4 !important; } + .teal--text.text--lighten-3 { - color: #80cbc4 !important; - caret-color: #80cbc4 !important; + color: #80cbc4 !important; + caret-color: #80cbc4 !important; } + .teal.lighten-2 { - background-color: #4db6ac !important; - border-color: #4db6ac !important; + background-color: #4db6ac !important; + border-color: #4db6ac !important; } + .teal--text.text--lighten-2 { - color: #4db6ac !important; - caret-color: #4db6ac !important; + color: #4db6ac !important; + caret-color: #4db6ac !important; } + .teal.lighten-1 { - background-color: #26a69a !important; - border-color: #26a69a !important; + background-color: #26a69a !important; + border-color: #26a69a !important; } + .teal--text.text--lighten-1 { - color: #26a69a !important; - caret-color: #26a69a !important; + color: #26a69a !important; + caret-color: #26a69a !important; } + .teal.darken-1 { - background-color: #00897b !important; - border-color: #00897b !important; + background-color: #00897b !important; + border-color: #00897b !important; } + .teal--text.text--darken-1 { - color: #00897b !important; - caret-color: #00897b !important; + color: #00897b !important; + caret-color: #00897b !important; } + .teal.darken-2 { - background-color: #00796b !important; - border-color: #00796b !important; + background-color: #00796b !important; + border-color: #00796b !important; } + .teal--text.text--darken-2 { - color: #00796b !important; - caret-color: #00796b !important; + color: #00796b !important; + caret-color: #00796b !important; } + .teal.darken-3 { - background-color: #00695c !important; - border-color: #00695c !important; + background-color: #00695c !important; + border-color: #00695c !important; } + .teal--text.text--darken-3 { - color: #00695c !important; - caret-color: #00695c !important; + color: #00695c !important; + caret-color: #00695c !important; } + .teal.darken-4 { - background-color: #004d40 !important; - border-color: #004d40 !important; + background-color: #004d40 !important; + border-color: #004d40 !important; } + .teal--text.text--darken-4 { - color: #004d40 !important; - caret-color: #004d40 !important; + color: #004d40 !important; + caret-color: #004d40 !important; } + .teal.accent-1 { - background-color: #a7ffeb !important; - border-color: #a7ffeb !important; + background-color: #a7ffeb !important; + border-color: #a7ffeb !important; } + .teal--text.text--accent-1 { - color: #a7ffeb !important; - caret-color: #a7ffeb !important; + color: #a7ffeb !important; + caret-color: #a7ffeb !important; } + .teal.accent-2 { - background-color: #64ffda !important; - border-color: #64ffda !important; + background-color: #64ffda !important; + border-color: #64ffda !important; } + .teal--text.text--accent-2 { - color: #64ffda !important; - caret-color: #64ffda !important; + color: #64ffda !important; + caret-color: #64ffda !important; } + .teal.accent-3 { - background-color: #1de9b6 !important; - border-color: #1de9b6 !important; + background-color: #1de9b6 !important; + border-color: #1de9b6 !important; } + .teal--text.text--accent-3 { - color: #1de9b6 !important; - caret-color: #1de9b6 !important; + color: #1de9b6 !important; + caret-color: #1de9b6 !important; } + .teal.accent-4 { - background-color: #00bfa5 !important; - border-color: #00bfa5 !important; + background-color: #00bfa5 !important; + border-color: #00bfa5 !important; } + .teal--text.text--accent-4 { - color: #00bfa5 !important; - caret-color: #00bfa5 !important; + color: #00bfa5 !important; + caret-color: #00bfa5 !important; } + .green { - background-color: #4caf50 !important; - border-color: #4caf50 !important; + background-color: #4caf50 !important; + border-color: #4caf50 !important; } + .green--text { - color: #4caf50 !important; - caret-color: #4caf50 !important; + color: #4caf50 !important; + caret-color: #4caf50 !important; } + .green.lighten-5 { - background-color: #e8f5e9 !important; - border-color: #e8f5e9 !important; + background-color: #e8f5e9 !important; + border-color: #e8f5e9 !important; } + .green--text.text--lighten-5 { - color: #e8f5e9 !important; - caret-color: #e8f5e9 !important; + color: #e8f5e9 !important; + caret-color: #e8f5e9 !important; } + .green.lighten-4 { - background-color: #c8e6c9 !important; - border-color: #c8e6c9 !important; + background-color: #c8e6c9 !important; + border-color: #c8e6c9 !important; } + .green--text.text--lighten-4 { - color: #c8e6c9 !important; - caret-color: #c8e6c9 !important; + color: #c8e6c9 !important; + caret-color: #c8e6c9 !important; } + .green.lighten-3 { - background-color: #a5d6a7 !important; - border-color: #a5d6a7 !important; + background-color: #a5d6a7 !important; + border-color: #a5d6a7 !important; } + .green--text.text--lighten-3 { - color: #a5d6a7 !important; - caret-color: #a5d6a7 !important; + color: #a5d6a7 !important; + caret-color: #a5d6a7 !important; } + .green.lighten-2 { - background-color: #81c784 !important; - border-color: #81c784 !important; + background-color: #81c784 !important; + border-color: #81c784 !important; } + .green--text.text--lighten-2 { - color: #81c784 !important; - caret-color: #81c784 !important; + color: #81c784 !important; + caret-color: #81c784 !important; } + .green.lighten-1 { - background-color: #66bb6a !important; - border-color: #66bb6a !important; + background-color: #66bb6a !important; + border-color: #66bb6a !important; } + .green--text.text--lighten-1 { - color: #66bb6a !important; - caret-color: #66bb6a !important; + color: #66bb6a !important; + caret-color: #66bb6a !important; } + .green.darken-1 { - background-color: #43a047 !important; - border-color: #43a047 !important; + background-color: #43a047 !important; + border-color: #43a047 !important; } + .green--text.text--darken-1 { - color: #43a047 !important; - caret-color: #43a047 !important; + color: #43a047 !important; + caret-color: #43a047 !important; } + .green.darken-2 { - background-color: #388e3c !important; - border-color: #388e3c !important; + background-color: #388e3c !important; + border-color: #388e3c !important; } + .green--text.text--darken-2 { - color: #388e3c !important; - caret-color: #388e3c !important; + color: #388e3c !important; + caret-color: #388e3c !important; } + .green.darken-3 { - background-color: #2e7d32 !important; - border-color: #2e7d32 !important; + background-color: #2e7d32 !important; + border-color: #2e7d32 !important; } + .green--text.text--darken-3 { - color: #2e7d32 !important; - caret-color: #2e7d32 !important; + color: #2e7d32 !important; + caret-color: #2e7d32 !important; } + .green.darken-4 { - background-color: #1b5e20 !important; - border-color: #1b5e20 !important; + background-color: #1b5e20 !important; + border-color: #1b5e20 !important; } + .green--text.text--darken-4 { - color: #1b5e20 !important; - caret-color: #1b5e20 !important; + color: #1b5e20 !important; + caret-color: #1b5e20 !important; } + .green.accent-1 { - background-color: #b9f6ca !important; - border-color: #b9f6ca !important; + background-color: #b9f6ca !important; + border-color: #b9f6ca !important; } + .green--text.text--accent-1 { - color: #b9f6ca !important; - caret-color: #b9f6ca !important; + color: #b9f6ca !important; + caret-color: #b9f6ca !important; } + .green.accent-2 { - background-color: #69f0ae !important; - border-color: #69f0ae !important; + background-color: #69f0ae !important; + border-color: #69f0ae !important; } + .green--text.text--accent-2 { - color: #69f0ae !important; - caret-color: #69f0ae !important; + color: #69f0ae !important; + caret-color: #69f0ae !important; } + .green.accent-3 { - background-color: #00e676 !important; - border-color: #00e676 !important; + background-color: #00e676 !important; + border-color: #00e676 !important; } + .green--text.text--accent-3 { - color: #00e676 !important; - caret-color: #00e676 !important; + color: #00e676 !important; + caret-color: #00e676 !important; } + .green.accent-4 { - background-color: #00c853 !important; - border-color: #00c853 !important; + background-color: #00c853 !important; + border-color: #00c853 !important; } + .green--text.text--accent-4 { - color: #00c853 !important; - caret-color: #00c853 !important; + color: #00c853 !important; + caret-color: #00c853 !important; } + .light-green { - background-color: #8bc34a !important; - border-color: #8bc34a !important; + background-color: #8bc34a !important; + border-color: #8bc34a !important; } + .light-green--text { - color: #8bc34a !important; - caret-color: #8bc34a !important; + color: #8bc34a !important; + caret-color: #8bc34a !important; } + .light-green.lighten-5 { - background-color: #f1f8e9 !important; - border-color: #f1f8e9 !important; + background-color: #f1f8e9 !important; + border-color: #f1f8e9 !important; } + .light-green--text.text--lighten-5 { - color: #f1f8e9 !important; - caret-color: #f1f8e9 !important; + color: #f1f8e9 !important; + caret-color: #f1f8e9 !important; } + .light-green.lighten-4 { - background-color: #dcedc8 !important; - border-color: #dcedc8 !important; + background-color: #dcedc8 !important; + border-color: #dcedc8 !important; } + .light-green--text.text--lighten-4 { - color: #dcedc8 !important; - caret-color: #dcedc8 !important; + color: #dcedc8 !important; + caret-color: #dcedc8 !important; } + .light-green.lighten-3 { - background-color: #c5e1a5 !important; - border-color: #c5e1a5 !important; + background-color: #c5e1a5 !important; + border-color: #c5e1a5 !important; } + .light-green--text.text--lighten-3 { - color: #c5e1a5 !important; - caret-color: #c5e1a5 !important; + color: #c5e1a5 !important; + caret-color: #c5e1a5 !important; } + .light-green.lighten-2 { - background-color: #aed581 !important; - border-color: #aed581 !important; + background-color: #aed581 !important; + border-color: #aed581 !important; } + .light-green--text.text--lighten-2 { - color: #aed581 !important; - caret-color: #aed581 !important; + color: #aed581 !important; + caret-color: #aed581 !important; } + .light-green.lighten-1 { - background-color: #9ccc65 !important; - border-color: #9ccc65 !important; + background-color: #9ccc65 !important; + border-color: #9ccc65 !important; } + .light-green--text.text--lighten-1 { - color: #9ccc65 !important; - caret-color: #9ccc65 !important; + color: #9ccc65 !important; + caret-color: #9ccc65 !important; } + .light-green.darken-1 { - background-color: #7cb342 !important; - border-color: #7cb342 !important; + background-color: #7cb342 !important; + border-color: #7cb342 !important; } + .light-green--text.text--darken-1 { - color: #7cb342 !important; - caret-color: #7cb342 !important; + color: #7cb342 !important; + caret-color: #7cb342 !important; } + .light-green.darken-2 { - background-color: #689f38 !important; - border-color: #689f38 !important; + background-color: #689f38 !important; + border-color: #689f38 !important; } + .light-green--text.text--darken-2 { - color: #689f38 !important; - caret-color: #689f38 !important; + color: #689f38 !important; + caret-color: #689f38 !important; } + .light-green.darken-3 { - background-color: #558b2f !important; - border-color: #558b2f !important; + background-color: #558b2f !important; + border-color: #558b2f !important; } + .light-green--text.text--darken-3 { - color: #558b2f !important; - caret-color: #558b2f !important; + color: #558b2f !important; + caret-color: #558b2f !important; } + .light-green.darken-4 { - background-color: #33691e !important; - border-color: #33691e !important; + background-color: #33691e !important; + border-color: #33691e !important; } + .light-green--text.text--darken-4 { - color: #33691e !important; - caret-color: #33691e !important; + color: #33691e !important; + caret-color: #33691e !important; } + .light-green.accent-1 { - background-color: #ccff90 !important; - border-color: #ccff90 !important; + background-color: #ccff90 !important; + border-color: #ccff90 !important; } + .light-green--text.text--accent-1 { - color: #ccff90 !important; - caret-color: #ccff90 !important; + color: #ccff90 !important; + caret-color: #ccff90 !important; } + .light-green.accent-2 { - background-color: #b2ff59 !important; - border-color: #b2ff59 !important; + background-color: #b2ff59 !important; + border-color: #b2ff59 !important; } + .light-green--text.text--accent-2 { - color: #b2ff59 !important; - caret-color: #b2ff59 !important; + color: #b2ff59 !important; + caret-color: #b2ff59 !important; } + .light-green.accent-3 { - background-color: #76ff03 !important; - border-color: #76ff03 !important; + background-color: #76ff03 !important; + border-color: #76ff03 !important; } + .light-green--text.text--accent-3 { - color: #76ff03 !important; - caret-color: #76ff03 !important; + color: #76ff03 !important; + caret-color: #76ff03 !important; } + .light-green.accent-4 { - background-color: #64dd17 !important; - border-color: #64dd17 !important; + background-color: #64dd17 !important; + border-color: #64dd17 !important; } + .light-green--text.text--accent-4 { - color: #64dd17 !important; - caret-color: #64dd17 !important; + color: #64dd17 !important; + caret-color: #64dd17 !important; } + .lime { - background-color: #cddc39 !important; - border-color: #cddc39 !important; + background-color: #cddc39 !important; + border-color: #cddc39 !important; } + .lime--text { - color: #cddc39 !important; - caret-color: #cddc39 !important; + color: #cddc39 !important; + caret-color: #cddc39 !important; } + .lime.lighten-5 { - background-color: #f9fbe7 !important; - border-color: #f9fbe7 !important; + background-color: #f9fbe7 !important; + border-color: #f9fbe7 !important; } + .lime--text.text--lighten-5 { - color: #f9fbe7 !important; - caret-color: #f9fbe7 !important; + color: #f9fbe7 !important; + caret-color: #f9fbe7 !important; } + .lime.lighten-4 { - background-color: #f0f4c3 !important; - border-color: #f0f4c3 !important; + background-color: #f0f4c3 !important; + border-color: #f0f4c3 !important; } + .lime--text.text--lighten-4 { - color: #f0f4c3 !important; - caret-color: #f0f4c3 !important; + color: #f0f4c3 !important; + caret-color: #f0f4c3 !important; } + .lime.lighten-3 { - background-color: #e6ee9c !important; - border-color: #e6ee9c !important; + background-color: #e6ee9c !important; + border-color: #e6ee9c !important; } + .lime--text.text--lighten-3 { - color: #e6ee9c !important; - caret-color: #e6ee9c !important; + color: #e6ee9c !important; + caret-color: #e6ee9c !important; } + .lime.lighten-2 { - background-color: #dce775 !important; - border-color: #dce775 !important; + background-color: #dce775 !important; + border-color: #dce775 !important; } + .lime--text.text--lighten-2 { - color: #dce775 !important; - caret-color: #dce775 !important; + color: #dce775 !important; + caret-color: #dce775 !important; } + .lime.lighten-1 { - background-color: #d4e157 !important; - border-color: #d4e157 !important; + background-color: #d4e157 !important; + border-color: #d4e157 !important; } + .lime--text.text--lighten-1 { - color: #d4e157 !important; - caret-color: #d4e157 !important; + color: #d4e157 !important; + caret-color: #d4e157 !important; } + .lime.darken-1 { - background-color: #c0ca33 !important; - border-color: #c0ca33 !important; + background-color: #c0ca33 !important; + border-color: #c0ca33 !important; } + .lime--text.text--darken-1 { - color: #c0ca33 !important; - caret-color: #c0ca33 !important; + color: #c0ca33 !important; + caret-color: #c0ca33 !important; } + .lime.darken-2 { - background-color: #afb42b !important; - border-color: #afb42b !important; + background-color: #afb42b !important; + border-color: #afb42b !important; } + .lime--text.text--darken-2 { - color: #afb42b !important; - caret-color: #afb42b !important; + color: #afb42b !important; + caret-color: #afb42b !important; } + .lime.darken-3 { - background-color: #9e9d24 !important; - border-color: #9e9d24 !important; + background-color: #9e9d24 !important; + border-color: #9e9d24 !important; } + .lime--text.text--darken-3 { - color: #9e9d24 !important; - caret-color: #9e9d24 !important; + color: #9e9d24 !important; + caret-color: #9e9d24 !important; } + .lime.darken-4 { - background-color: #827717 !important; - border-color: #827717 !important; + background-color: #827717 !important; + border-color: #827717 !important; } + .lime--text.text--darken-4 { - color: #827717 !important; - caret-color: #827717 !important; + color: #827717 !important; + caret-color: #827717 !important; } + .lime.accent-1 { - background-color: #f4ff81 !important; - border-color: #f4ff81 !important; + background-color: #f4ff81 !important; + border-color: #f4ff81 !important; } + .lime--text.text--accent-1 { - color: #f4ff81 !important; - caret-color: #f4ff81 !important; + color: #f4ff81 !important; + caret-color: #f4ff81 !important; } + .lime.accent-2 { - background-color: #eeff41 !important; - border-color: #eeff41 !important; + background-color: #eeff41 !important; + border-color: #eeff41 !important; } + .lime--text.text--accent-2 { - color: #eeff41 !important; - caret-color: #eeff41 !important; + color: #eeff41 !important; + caret-color: #eeff41 !important; } + .lime.accent-3 { - background-color: #c6ff00 !important; - border-color: #c6ff00 !important; + background-color: #c6ff00 !important; + border-color: #c6ff00 !important; } + .lime--text.text--accent-3 { - color: #c6ff00 !important; - caret-color: #c6ff00 !important; + color: #c6ff00 !important; + caret-color: #c6ff00 !important; } + .lime.accent-4 { - background-color: #aeea00 !important; - border-color: #aeea00 !important; + background-color: #aeea00 !important; + border-color: #aeea00 !important; } + .lime--text.text--accent-4 { - color: #aeea00 !important; - caret-color: #aeea00 !important; + color: #aeea00 !important; + caret-color: #aeea00 !important; } + .yellow { - background-color: #ffeb3b !important; - border-color: #ffeb3b !important; + background-color: #ffeb3b !important; + border-color: #ffeb3b !important; } + .yellow--text { - color: #ffeb3b !important; - caret-color: #ffeb3b !important; + color: #ffeb3b !important; + caret-color: #ffeb3b !important; } + .yellow.lighten-5 { - background-color: #fffde7 !important; - border-color: #fffde7 !important; + background-color: #fffde7 !important; + border-color: #fffde7 !important; } + .yellow--text.text--lighten-5 { - color: #fffde7 !important; - caret-color: #fffde7 !important; + color: #fffde7 !important; + caret-color: #fffde7 !important; } + .yellow.lighten-4 { - background-color: #fff9c4 !important; - border-color: #fff9c4 !important; + background-color: #fff9c4 !important; + border-color: #fff9c4 !important; } + .yellow--text.text--lighten-4 { - color: #fff9c4 !important; - caret-color: #fff9c4 !important; + color: #fff9c4 !important; + caret-color: #fff9c4 !important; } + .yellow.lighten-3 { - background-color: #fff59d !important; - border-color: #fff59d !important; + background-color: #fff59d !important; + border-color: #fff59d !important; } + .yellow--text.text--lighten-3 { - color: #fff59d !important; - caret-color: #fff59d !important; + color: #fff59d !important; + caret-color: #fff59d !important; } + .yellow.lighten-2 { - background-color: #fff176 !important; - border-color: #fff176 !important; + background-color: #fff176 !important; + border-color: #fff176 !important; } + .yellow--text.text--lighten-2 { - color: #fff176 !important; - caret-color: #fff176 !important; + color: #fff176 !important; + caret-color: #fff176 !important; } + .yellow.lighten-1 { - background-color: #ffee58 !important; - border-color: #ffee58 !important; + background-color: #ffee58 !important; + border-color: #ffee58 !important; } + .yellow--text.text--lighten-1 { - color: #ffee58 !important; - caret-color: #ffee58 !important; + color: #ffee58 !important; + caret-color: #ffee58 !important; } + .yellow.darken-1 { - background-color: #fdd835 !important; - border-color: #fdd835 !important; + background-color: #fdd835 !important; + border-color: #fdd835 !important; } + .yellow--text.text--darken-1 { - color: #fdd835 !important; - caret-color: #fdd835 !important; + color: #fdd835 !important; + caret-color: #fdd835 !important; } + .yellow.darken-2 { - background-color: #fbc02d !important; - border-color: #fbc02d !important; + background-color: #fbc02d !important; + border-color: #fbc02d !important; } + .yellow--text.text--darken-2 { - color: #fbc02d !important; - caret-color: #fbc02d !important; + color: #fbc02d !important; + caret-color: #fbc02d !important; } + .yellow.darken-3 { - background-color: #f9a825 !important; - border-color: #f9a825 !important; + background-color: #f9a825 !important; + border-color: #f9a825 !important; } + .yellow--text.text--darken-3 { - color: #f9a825 !important; - caret-color: #f9a825 !important; + color: #f9a825 !important; + caret-color: #f9a825 !important; } + .yellow.darken-4 { - background-color: #f57f17 !important; - border-color: #f57f17 !important; + background-color: #f57f17 !important; + border-color: #f57f17 !important; } + .yellow--text.text--darken-4 { - color: #f57f17 !important; - caret-color: #f57f17 !important; + color: #f57f17 !important; + caret-color: #f57f17 !important; } + .yellow.accent-1 { - background-color: #ffff8d !important; - border-color: #ffff8d !important; + background-color: #ffff8d !important; + border-color: #ffff8d !important; } + .yellow--text.text--accent-1 { - color: #ffff8d !important; - caret-color: #ffff8d !important; + color: #ffff8d !important; + caret-color: #ffff8d !important; } + .yellow.accent-2 { - background-color: #ff0 !important; - border-color: #ff0 !important; + background-color: #ff0 !important; + border-color: #ff0 !important; } + .yellow--text.text--accent-2 { - color: #ff0 !important; - caret-color: #ff0 !important; + color: #ff0 !important; + caret-color: #ff0 !important; } + .yellow.accent-3 { - background-color: #ffea00 !important; - border-color: #ffea00 !important; + background-color: #ffea00 !important; + border-color: #ffea00 !important; } + .yellow--text.text--accent-3 { - color: #ffea00 !important; - caret-color: #ffea00 !important; + color: #ffea00 !important; + caret-color: #ffea00 !important; } + .yellow.accent-4 { - background-color: #ffd600 !important; - border-color: #ffd600 !important; + background-color: #ffd600 !important; + border-color: #ffd600 !important; } + .yellow--text.text--accent-4 { - color: #ffd600 !important; - caret-color: #ffd600 !important; + color: #ffd600 !important; + caret-color: #ffd600 !important; } + .amber { - background-color: #ffc107 !important; - border-color: #ffc107 !important; + background-color: #ffc107 !important; + border-color: #ffc107 !important; } + .amber--text { - color: #ffc107 !important; - caret-color: #ffc107 !important; + color: #ffc107 !important; + caret-color: #ffc107 !important; } + .amber.lighten-5 { - background-color: #fff8e1 !important; - border-color: #fff8e1 !important; + background-color: #fff8e1 !important; + border-color: #fff8e1 !important; } + .amber--text.text--lighten-5 { - color: #fff8e1 !important; - caret-color: #fff8e1 !important; + color: #fff8e1 !important; + caret-color: #fff8e1 !important; } + .amber.lighten-4 { - background-color: #ffecb3 !important; - border-color: #ffecb3 !important; + background-color: #ffecb3 !important; + border-color: #ffecb3 !important; } + .amber--text.text--lighten-4 { - color: #ffecb3 !important; - caret-color: #ffecb3 !important; + color: #ffecb3 !important; + caret-color: #ffecb3 !important; } + .amber.lighten-3 { - background-color: #ffe082 !important; - border-color: #ffe082 !important; + background-color: #ffe082 !important; + border-color: #ffe082 !important; } + .amber--text.text--lighten-3 { - color: #ffe082 !important; - caret-color: #ffe082 !important; + color: #ffe082 !important; + caret-color: #ffe082 !important; } + .amber.lighten-2 { - background-color: #ffd54f !important; - border-color: #ffd54f !important; + background-color: #ffd54f !important; + border-color: #ffd54f !important; } + .amber--text.text--lighten-2 { - color: #ffd54f !important; - caret-color: #ffd54f !important; + color: #ffd54f !important; + caret-color: #ffd54f !important; } + .amber.lighten-1 { - background-color: #ffca28 !important; - border-color: #ffca28 !important; + background-color: #ffca28 !important; + border-color: #ffca28 !important; } + .amber--text.text--lighten-1 { - color: #ffca28 !important; - caret-color: #ffca28 !important; + color: #ffca28 !important; + caret-color: #ffca28 !important; } + .amber.darken-1 { - background-color: #ffb300 !important; - border-color: #ffb300 !important; + background-color: #ffb300 !important; + border-color: #ffb300 !important; } + .amber--text.text--darken-1 { - color: #ffb300 !important; - caret-color: #ffb300 !important; + color: #ffb300 !important; + caret-color: #ffb300 !important; } + .amber.darken-2 { - background-color: #ffa000 !important; - border-color: #ffa000 !important; + background-color: #ffa000 !important; + border-color: #ffa000 !important; } + .amber--text.text--darken-2 { - color: #ffa000 !important; - caret-color: #ffa000 !important; + color: #ffa000 !important; + caret-color: #ffa000 !important; } + .amber.darken-3 { - background-color: #ff8f00 !important; - border-color: #ff8f00 !important; + background-color: #ff8f00 !important; + border-color: #ff8f00 !important; } + .amber--text.text--darken-3 { - color: #ff8f00 !important; - caret-color: #ff8f00 !important; + color: #ff8f00 !important; + caret-color: #ff8f00 !important; } + .amber.darken-4 { - background-color: #ff6f00 !important; - border-color: #ff6f00 !important; + background-color: #ff6f00 !important; + border-color: #ff6f00 !important; } + .amber--text.text--darken-4 { - color: #ff6f00 !important; - caret-color: #ff6f00 !important; + color: #ff6f00 !important; + caret-color: #ff6f00 !important; } + .amber.accent-1 { - background-color: #ffe57f !important; - border-color: #ffe57f !important; + background-color: #ffe57f !important; + border-color: #ffe57f !important; } + .amber--text.text--accent-1 { - color: #ffe57f !important; - caret-color: #ffe57f !important; + color: #ffe57f !important; + caret-color: #ffe57f !important; } + .amber.accent-2 { - background-color: #ffd740 !important; - border-color: #ffd740 !important; + background-color: #ffd740 !important; + border-color: #ffd740 !important; } + .amber--text.text--accent-2 { - color: #ffd740 !important; - caret-color: #ffd740 !important; + color: #ffd740 !important; + caret-color: #ffd740 !important; } + .amber.accent-3 { - background-color: #ffc400 !important; - border-color: #ffc400 !important; + background-color: #ffc400 !important; + border-color: #ffc400 !important; } + .amber--text.text--accent-3 { - color: #ffc400 !important; - caret-color: #ffc400 !important; + color: #ffc400 !important; + caret-color: #ffc400 !important; } + .amber.accent-4 { - background-color: #ffab00 !important; - border-color: #ffab00 !important; + background-color: #ffab00 !important; + border-color: #ffab00 !important; } + .amber--text.text--accent-4 { - color: #ffab00 !important; - caret-color: #ffab00 !important; + color: #ffab00 !important; + caret-color: #ffab00 !important; } + .orange { - background-color: #ff9800 !important; - border-color: #ff9800 !important; + background-color: #ff9800 !important; + border-color: #ff9800 !important; } + .orange--text { - color: #ff9800 !important; - caret-color: #ff9800 !important; + color: #ff9800 !important; + caret-color: #ff9800 !important; } + .orange.lighten-5 { - background-color: #fff3e0 !important; - border-color: #fff3e0 !important; + background-color: #fff3e0 !important; + border-color: #fff3e0 !important; } + .orange--text.text--lighten-5 { - color: #fff3e0 !important; - caret-color: #fff3e0 !important; + color: #fff3e0 !important; + caret-color: #fff3e0 !important; } + .orange.lighten-4 { - background-color: #ffe0b2 !important; - border-color: #ffe0b2 !important; + background-color: #ffe0b2 !important; + border-color: #ffe0b2 !important; } + .orange--text.text--lighten-4 { - color: #ffe0b2 !important; - caret-color: #ffe0b2 !important; + color: #ffe0b2 !important; + caret-color: #ffe0b2 !important; } + .orange.lighten-3 { - background-color: #ffcc80 !important; - border-color: #ffcc80 !important; + background-color: #ffcc80 !important; + border-color: #ffcc80 !important; } + .orange--text.text--lighten-3 { - color: #ffcc80 !important; - caret-color: #ffcc80 !important; + color: #ffcc80 !important; + caret-color: #ffcc80 !important; } + .orange.lighten-2 { - background-color: #ffb74d !important; - border-color: #ffb74d !important; + background-color: #ffb74d !important; + border-color: #ffb74d !important; } + .orange--text.text--lighten-2 { - color: #ffb74d !important; - caret-color: #ffb74d !important; + color: #ffb74d !important; + caret-color: #ffb74d !important; } + .orange.lighten-1 { - background-color: #ffa726 !important; - border-color: #ffa726 !important; + background-color: #ffa726 !important; + border-color: #ffa726 !important; } + .orange--text.text--lighten-1 { - color: #ffa726 !important; - caret-color: #ffa726 !important; + color: #ffa726 !important; + caret-color: #ffa726 !important; } + .orange.darken-1 { - background-color: #fb8c00 !important; - border-color: #fb8c00 !important; + background-color: #fb8c00 !important; + border-color: #fb8c00 !important; } + .orange--text.text--darken-1 { - color: #fb8c00 !important; - caret-color: #fb8c00 !important; + color: #fb8c00 !important; + caret-color: #fb8c00 !important; } + .orange.darken-2 { - background-color: #f57c00 !important; - border-color: #f57c00 !important; + background-color: #f57c00 !important; + border-color: #f57c00 !important; } + .orange--text.text--darken-2 { - color: #f57c00 !important; - caret-color: #f57c00 !important; + color: #f57c00 !important; + caret-color: #f57c00 !important; } + .orange.darken-3 { - background-color: #ef6c00 !important; - border-color: #ef6c00 !important; + background-color: #ef6c00 !important; + border-color: #ef6c00 !important; } + .orange--text.text--darken-3 { - color: #ef6c00 !important; - caret-color: #ef6c00 !important; + color: #ef6c00 !important; + caret-color: #ef6c00 !important; } + .orange.darken-4 { - background-color: #e65100 !important; - border-color: #e65100 !important; + background-color: #e65100 !important; + border-color: #e65100 !important; } + .orange--text.text--darken-4 { - color: #e65100 !important; - caret-color: #e65100 !important; + color: #e65100 !important; + caret-color: #e65100 !important; } + .orange.accent-1 { - background-color: #ffd180 !important; - border-color: #ffd180 !important; + background-color: #ffd180 !important; + border-color: #ffd180 !important; } + .orange--text.text--accent-1 { - color: #ffd180 !important; - caret-color: #ffd180 !important; + color: #ffd180 !important; + caret-color: #ffd180 !important; } + .orange.accent-2 { - background-color: #ffab40 !important; - border-color: #ffab40 !important; + background-color: #ffab40 !important; + border-color: #ffab40 !important; } + .orange--text.text--accent-2 { - color: #ffab40 !important; - caret-color: #ffab40 !important; + color: #ffab40 !important; + caret-color: #ffab40 !important; } + .orange.accent-3 { - background-color: #ff9100 !important; - border-color: #ff9100 !important; + background-color: #ff9100 !important; + border-color: #ff9100 !important; } + .orange--text.text--accent-3 { - color: #ff9100 !important; - caret-color: #ff9100 !important; + color: #ff9100 !important; + caret-color: #ff9100 !important; } + .orange.accent-4 { - background-color: #ff6d00 !important; - border-color: #ff6d00 !important; + background-color: #ff6d00 !important; + border-color: #ff6d00 !important; } + .orange--text.text--accent-4 { - color: #ff6d00 !important; - caret-color: #ff6d00 !important; + color: #ff6d00 !important; + caret-color: #ff6d00 !important; } + .deep-orange { - background-color: #ff5722 !important; - border-color: #ff5722 !important; + background-color: #ff5722 !important; + border-color: #ff5722 !important; } + .deep-orange--text { - color: #ff5722 !important; - caret-color: #ff5722 !important; + color: #ff5722 !important; + caret-color: #ff5722 !important; } + .deep-orange.lighten-5 { - background-color: #fbe9e7 !important; - border-color: #fbe9e7 !important; + background-color: #fbe9e7 !important; + border-color: #fbe9e7 !important; } + .deep-orange--text.text--lighten-5 { - color: #fbe9e7 !important; - caret-color: #fbe9e7 !important; + color: #fbe9e7 !important; + caret-color: #fbe9e7 !important; } + .deep-orange.lighten-4 { - background-color: #ffccbc !important; - border-color: #ffccbc !important; + background-color: #ffccbc !important; + border-color: #ffccbc !important; } + .deep-orange--text.text--lighten-4 { - color: #ffccbc !important; - caret-color: #ffccbc !important; + color: #ffccbc !important; + caret-color: #ffccbc !important; } + .deep-orange.lighten-3 { - background-color: #ffab91 !important; - border-color: #ffab91 !important; + background-color: #ffab91 !important; + border-color: #ffab91 !important; } + .deep-orange--text.text--lighten-3 { - color: #ffab91 !important; - caret-color: #ffab91 !important; + color: #ffab91 !important; + caret-color: #ffab91 !important; } + .deep-orange.lighten-2 { - background-color: #ff8a65 !important; - border-color: #ff8a65 !important; + background-color: #ff8a65 !important; + border-color: #ff8a65 !important; } + .deep-orange--text.text--lighten-2 { - color: #ff8a65 !important; - caret-color: #ff8a65 !important; + color: #ff8a65 !important; + caret-color: #ff8a65 !important; } + .deep-orange.lighten-1 { - background-color: #ff7043 !important; - border-color: #ff7043 !important; + background-color: #ff7043 !important; + border-color: #ff7043 !important; } + .deep-orange--text.text--lighten-1 { - color: #ff7043 !important; - caret-color: #ff7043 !important; + color: #ff7043 !important; + caret-color: #ff7043 !important; } + .deep-orange.darken-1 { - background-color: #f4511e !important; - border-color: #f4511e !important; + background-color: #f4511e !important; + border-color: #f4511e !important; } + .deep-orange--text.text--darken-1 { - color: #f4511e !important; - caret-color: #f4511e !important; + color: #f4511e !important; + caret-color: #f4511e !important; } + .deep-orange.darken-2 { - background-color: #e64a19 !important; - border-color: #e64a19 !important; + background-color: #e64a19 !important; + border-color: #e64a19 !important; } + .deep-orange--text.text--darken-2 { - color: #e64a19 !important; - caret-color: #e64a19 !important; + color: #e64a19 !important; + caret-color: #e64a19 !important; } + .deep-orange.darken-3 { - background-color: #d84315 !important; - border-color: #d84315 !important; + background-color: #d84315 !important; + border-color: #d84315 !important; } + .deep-orange--text.text--darken-3 { - color: #d84315 !important; - caret-color: #d84315 !important; + color: #d84315 !important; + caret-color: #d84315 !important; } + .deep-orange.darken-4 { - background-color: #bf360c !important; - border-color: #bf360c !important; + background-color: #bf360c !important; + border-color: #bf360c !important; } + .deep-orange--text.text--darken-4 { - color: #bf360c !important; - caret-color: #bf360c !important; + color: #bf360c !important; + caret-color: #bf360c !important; } + .deep-orange.accent-1 { - background-color: #ff9e80 !important; - border-color: #ff9e80 !important; + background-color: #ff9e80 !important; + border-color: #ff9e80 !important; } + .deep-orange--text.text--accent-1 { - color: #ff9e80 !important; - caret-color: #ff9e80 !important; + color: #ff9e80 !important; + caret-color: #ff9e80 !important; } + .deep-orange.accent-2 { - background-color: #ff6e40 !important; - border-color: #ff6e40 !important; + background-color: #ff6e40 !important; + border-color: #ff6e40 !important; } + .deep-orange--text.text--accent-2 { - color: #ff6e40 !important; - caret-color: #ff6e40 !important; + color: #ff6e40 !important; + caret-color: #ff6e40 !important; } + .deep-orange.accent-3 { - background-color: #ff3d00 !important; - border-color: #ff3d00 !important; + background-color: #ff3d00 !important; + border-color: #ff3d00 !important; } + .deep-orange--text.text--accent-3 { - color: #ff3d00 !important; - caret-color: #ff3d00 !important; + color: #ff3d00 !important; + caret-color: #ff3d00 !important; } + .deep-orange.accent-4 { - background-color: #dd2c00 !important; - border-color: #dd2c00 !important; + background-color: #dd2c00 !important; + border-color: #dd2c00 !important; } + .deep-orange--text.text--accent-4 { - color: #dd2c00 !important; - caret-color: #dd2c00 !important; + color: #dd2c00 !important; + caret-color: #dd2c00 !important; } + .brown { - background-color: #795548 !important; - border-color: #795548 !important; + background-color: #795548 !important; + border-color: #795548 !important; } + .brown--text { - color: #795548 !important; - caret-color: #795548 !important; + color: #795548 !important; + caret-color: #795548 !important; } + .brown.lighten-5 { - background-color: #efebe9 !important; - border-color: #efebe9 !important; + background-color: #efebe9 !important; + border-color: #efebe9 !important; } + .brown--text.text--lighten-5 { - color: #efebe9 !important; - caret-color: #efebe9 !important; + color: #efebe9 !important; + caret-color: #efebe9 !important; } + .brown.lighten-4 { - background-color: #d7ccc8 !important; - border-color: #d7ccc8 !important; + background-color: #d7ccc8 !important; + border-color: #d7ccc8 !important; } + .brown--text.text--lighten-4 { - color: #d7ccc8 !important; - caret-color: #d7ccc8 !important; + color: #d7ccc8 !important; + caret-color: #d7ccc8 !important; } + .brown.lighten-3 { - background-color: #bcaaa4 !important; - border-color: #bcaaa4 !important; + background-color: #bcaaa4 !important; + border-color: #bcaaa4 !important; } + .brown--text.text--lighten-3 { - color: #bcaaa4 !important; - caret-color: #bcaaa4 !important; + color: #bcaaa4 !important; + caret-color: #bcaaa4 !important; } + .brown.lighten-2 { - background-color: #a1887f !important; - border-color: #a1887f !important; + background-color: #a1887f !important; + border-color: #a1887f !important; } + .brown--text.text--lighten-2 { - color: #a1887f !important; - caret-color: #a1887f !important; + color: #a1887f !important; + caret-color: #a1887f !important; } + .brown.lighten-1 { - background-color: #8d6e63 !important; - border-color: #8d6e63 !important; + background-color: #8d6e63 !important; + border-color: #8d6e63 !important; } + .brown--text.text--lighten-1 { - color: #8d6e63 !important; - caret-color: #8d6e63 !important; + color: #8d6e63 !important; + caret-color: #8d6e63 !important; } + .brown.darken-1 { - background-color: #6d4c41 !important; - border-color: #6d4c41 !important; + background-color: #6d4c41 !important; + border-color: #6d4c41 !important; } + .brown--text.text--darken-1 { - color: #6d4c41 !important; - caret-color: #6d4c41 !important; + color: #6d4c41 !important; + caret-color: #6d4c41 !important; } + .brown.darken-2 { - background-color: #5d4037 !important; - border-color: #5d4037 !important; + background-color: #5d4037 !important; + border-color: #5d4037 !important; } + .brown--text.text--darken-2 { - color: #5d4037 !important; - caret-color: #5d4037 !important; + color: #5d4037 !important; + caret-color: #5d4037 !important; } + .brown.darken-3 { - background-color: #4e342e !important; - border-color: #4e342e !important; + background-color: #4e342e !important; + border-color: #4e342e !important; } + .brown--text.text--darken-3 { - color: #4e342e !important; - caret-color: #4e342e !important; + color: #4e342e !important; + caret-color: #4e342e !important; } + .brown.darken-4 { - background-color: #3e2723 !important; - border-color: #3e2723 !important; + background-color: #3e2723 !important; + border-color: #3e2723 !important; } + .brown--text.text--darken-4 { - color: #3e2723 !important; - caret-color: #3e2723 !important; + color: #3e2723 !important; + caret-color: #3e2723 !important; } + .blue-grey { - background-color: #607d8b !important; - border-color: #607d8b !important; + background-color: #607d8b !important; + border-color: #607d8b !important; } + .blue-grey--text { - color: #607d8b !important; - caret-color: #607d8b !important; + color: #607d8b !important; + caret-color: #607d8b !important; } + .blue-grey.lighten-5 { - background-color: #eceff1 !important; - border-color: #eceff1 !important; + background-color: #eceff1 !important; + border-color: #eceff1 !important; } + .blue-grey--text.text--lighten-5 { - color: #eceff1 !important; - caret-color: #eceff1 !important; + color: #eceff1 !important; + caret-color: #eceff1 !important; } + .blue-grey.lighten-4 { - background-color: #cfd8dc !important; - border-color: #cfd8dc !important; + background-color: #cfd8dc !important; + border-color: #cfd8dc !important; } + .blue-grey--text.text--lighten-4 { - color: #cfd8dc !important; - caret-color: #cfd8dc !important; + color: #cfd8dc !important; + caret-color: #cfd8dc !important; } + .blue-grey.lighten-3 { - background-color: #b0bec5 !important; - border-color: #b0bec5 !important; + background-color: #b0bec5 !important; + border-color: #b0bec5 !important; } + .blue-grey--text.text--lighten-3 { - color: #b0bec5 !important; - caret-color: #b0bec5 !important; + color: #b0bec5 !important; + caret-color: #b0bec5 !important; } + .blue-grey.lighten-2 { - background-color: #90a4ae !important; - border-color: #90a4ae !important; + background-color: #90a4ae !important; + border-color: #90a4ae !important; } + .blue-grey--text.text--lighten-2 { - color: #90a4ae !important; - caret-color: #90a4ae !important; + color: #90a4ae !important; + caret-color: #90a4ae !important; } + .blue-grey.lighten-1 { - background-color: #78909c !important; - border-color: #78909c !important; + background-color: #78909c !important; + border-color: #78909c !important; } + .blue-grey--text.text--lighten-1 { - color: #78909c !important; - caret-color: #78909c !important; + color: #78909c !important; + caret-color: #78909c !important; } + .blue-grey.darken-1 { - background-color: #546e7a !important; - border-color: #546e7a !important; + background-color: #546e7a !important; + border-color: #546e7a !important; } + .blue-grey--text.text--darken-1 { - color: #546e7a !important; - caret-color: #546e7a !important; + color: #546e7a !important; + caret-color: #546e7a !important; } + .blue-grey.darken-2 { - background-color: #455a64 !important; - border-color: #455a64 !important; + background-color: #455a64 !important; + border-color: #455a64 !important; } + .blue-grey--text.text--darken-2 { - color: #455a64 !important; - caret-color: #455a64 !important; + color: #455a64 !important; + caret-color: #455a64 !important; } + .blue-grey.darken-3 { - background-color: #37474f !important; - border-color: #37474f !important; + background-color: #37474f !important; + border-color: #37474f !important; } + .blue-grey--text.text--darken-3 { - color: #37474f !important; - caret-color: #37474f !important; + color: #37474f !important; + caret-color: #37474f !important; } + .blue-grey.darken-4 { - background-color: #263238 !important; - border-color: #263238 !important; + background-color: #263238 !important; + border-color: #263238 !important; } + .blue-grey--text.text--darken-4 { - color: #263238 !important; - caret-color: #263238 !important; + color: #263238 !important; + caret-color: #263238 !important; } + .grey { - background-color: #9e9e9e !important; - border-color: #9e9e9e !important; + background-color: #9e9e9e !important; + border-color: #9e9e9e !important; } + .grey--text { - color: #9e9e9e !important; - caret-color: #9e9e9e !important; + color: #9e9e9e !important; + caret-color: #9e9e9e !important; } + .grey.lighten-5 { - background-color: #fafafa !important; - border-color: #fafafa !important; + background-color: #fafafa !important; + border-color: #fafafa !important; } + .grey--text.text--lighten-5 { - color: #fafafa !important; - caret-color: #fafafa !important; + color: #fafafa !important; + caret-color: #fafafa !important; } + .grey.lighten-4 { - background-color: #f5f5f5 !important; - border-color: #f5f5f5 !important; + background-color: #f5f5f5 !important; + border-color: #f5f5f5 !important; } + .grey--text.text--lighten-4 { - color: #f5f5f5 !important; - caret-color: #f5f5f5 !important; + color: #f5f5f5 !important; + caret-color: #f5f5f5 !important; } + .grey.lighten-3 { - background-color: #eee !important; - border-color: #eee !important; + background-color: #eee !important; + border-color: #eee !important; } + .grey--text.text--lighten-3 { - color: #eee !important; - caret-color: #eee !important; + color: #eee !important; + caret-color: #eee !important; } + .grey.lighten-2 { - background-color: #e0e0e0 !important; - border-color: #e0e0e0 !important; + background-color: #e0e0e0 !important; + border-color: #e0e0e0 !important; } + .grey--text.text--lighten-2 { - color: #e0e0e0 !important; - caret-color: #e0e0e0 !important; + color: #e0e0e0 !important; + caret-color: #e0e0e0 !important; } + .grey.lighten-1 { - background-color: #bdbdbd !important; - border-color: #bdbdbd !important; + background-color: #bdbdbd !important; + border-color: #bdbdbd !important; } + .grey--text.text--lighten-1 { - color: #bdbdbd !important; - caret-color: #bdbdbd !important; + color: #bdbdbd !important; + caret-color: #bdbdbd !important; } + .grey.darken-1 { - background-color: #757575 !important; - border-color: #757575 !important; + background-color: #757575 !important; + border-color: #757575 !important; } + .grey--text.text--darken-1 { - color: #757575 !important; - caret-color: #757575 !important; + color: #757575 !important; + caret-color: #757575 !important; } + .grey.darken-2 { - background-color: #616161 !important; - border-color: #616161 !important; + background-color: #616161 !important; + border-color: #616161 !important; } + .grey--text.text--darken-2 { - color: #616161 !important; - caret-color: #616161 !important; + color: #616161 !important; + caret-color: #616161 !important; } + .grey.darken-3 { - background-color: #424242 !important; - border-color: #424242 !important; + background-color: #424242 !important; + border-color: #424242 !important; } + .grey--text.text--darken-3 { - color: #424242 !important; - caret-color: #424242 !important; + color: #424242 !important; + caret-color: #424242 !important; } + .grey.darken-4 { - background-color: #212121 !important; - border-color: #212121 !important; + background-color: #212121 !important; + border-color: #212121 !important; } + .grey--text.text--darken-4 { - color: #212121 !important; - caret-color: #212121 !important; + color: #212121 !important; + caret-color: #212121 !important; } + .shades.black { - background-color: #000 !important; - border-color: #000 !important; + background-color: #000 !important; + border-color: #000 !important; } + .shades--text.text--black { - color: #000 !important; - caret-color: #000 !important; + color: #000 !important; + caret-color: #000 !important; } + .shades.white { - background-color: #fff !important; - border-color: #fff !important; + background-color: #fff !important; + border-color: #fff !important; } + .shades--text.text--white { - color: #fff !important; - caret-color: #fff !important; + color: #fff !important; + caret-color: #fff !important; } + .shades.transparent { - background-color: transparent !important; - border-color: transparent !important; + background-color: transparent !important; + border-color: transparent !important; } + .shades--text.text--transparent { - color: transparent !important; - caret-color: transparent !important; + color: transparent !important; + caret-color: transparent !important; } + .elevation-0 { - box-shadow: 0px 0px 0px 0px rgba(0,0,0,0.2), 0px 0px 0px 0px rgba(0,0,0,0.14), 0px 0px 0px 0px rgba(0,0,0,0.12) !important; + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12) !important; } + .elevation-1 { - box-shadow: 0px 2px 1px -1px rgba(0,0,0,0.2), 0px 1px 1px 0px rgba(0,0,0,0.14), 0px 1px 3px 0px rgba(0,0,0,0.12) !important; + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12) !important; } + .elevation-2 { - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12) !important; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12) !important; } + .elevation-3 { - box-shadow: 0px 3px 3px -2px rgba(0,0,0,0.2), 0px 3px 4px 0px rgba(0,0,0,0.14), 0px 1px 8px 0px rgba(0,0,0,0.12) !important; + box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12) !important; } + .elevation-4 { - box-shadow: 0px 2px 4px -1px rgba(0,0,0,0.2), 0px 4px 5px 0px rgba(0,0,0,0.14), 0px 1px 10px 0px rgba(0,0,0,0.12) !important; + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12) !important; } + .elevation-5 { - box-shadow: 0px 3px 5px -1px rgba(0,0,0,0.2), 0px 5px 8px 0px rgba(0,0,0,0.14), 0px 1px 14px 0px rgba(0,0,0,0.12) !important; + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14), 0px 1px 14px 0px rgba(0, 0, 0, 0.12) !important; } + .elevation-6 { - box-shadow: 0px 3px 5px -1px rgba(0,0,0,0.2), 0px 6px 10px 0px rgba(0,0,0,0.14), 0px 1px 18px 0px rgba(0,0,0,0.12) !important; + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12) !important; } + .elevation-7 { - box-shadow: 0px 4px 5px -2px rgba(0,0,0,0.2), 0px 7px 10px 1px rgba(0,0,0,0.14), 0px 2px 16px 1px rgba(0,0,0,0.12) !important; + box-shadow: 0px 4px 5px -2px rgba(0, 0, 0, 0.2), 0px 7px 10px 1px rgba(0, 0, 0, 0.14), 0px 2px 16px 1px rgba(0, 0, 0, 0.12) !important; } + .elevation-8 { - box-shadow: 0px 5px 5px -3px rgba(0,0,0,0.2), 0px 8px 10px 1px rgba(0,0,0,0.14), 0px 3px 14px 2px rgba(0,0,0,0.12) !important; + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12) !important; } + .elevation-9 { - box-shadow: 0px 5px 6px -3px rgba(0,0,0,0.2), 0px 9px 12px 1px rgba(0,0,0,0.14), 0px 3px 16px 2px rgba(0,0,0,0.12) !important; + box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.2), 0px 9px 12px 1px rgba(0, 0, 0, 0.14), 0px 3px 16px 2px rgba(0, 0, 0, 0.12) !important; } + .elevation-10 { - box-shadow: 0px 6px 6px -3px rgba(0,0,0,0.2), 0px 10px 14px 1px rgba(0,0,0,0.14), 0px 4px 18px 3px rgba(0,0,0,0.12) !important; + box-shadow: 0px 6px 6px -3px rgba(0, 0, 0, 0.2), 0px 10px 14px 1px rgba(0, 0, 0, 0.14), 0px 4px 18px 3px rgba(0, 0, 0, 0.12) !important; } + .elevation-11 { - box-shadow: 0px 6px 7px -4px rgba(0,0,0,0.2), 0px 11px 15px 1px rgba(0,0,0,0.14), 0px 4px 20px 3px rgba(0,0,0,0.12) !important; + box-shadow: 0px 6px 7px -4px rgba(0, 0, 0, 0.2), 0px 11px 15px 1px rgba(0, 0, 0, 0.14), 0px 4px 20px 3px rgba(0, 0, 0, 0.12) !important; } + .elevation-12 { - box-shadow: 0px 7px 8px -4px rgba(0,0,0,0.2), 0px 12px 17px 2px rgba(0,0,0,0.14), 0px 5px 22px 4px rgba(0,0,0,0.12) !important; + box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12) !important; } + .elevation-13 { - box-shadow: 0px 7px 8px -4px rgba(0,0,0,0.2), 0px 13px 19px 2px rgba(0,0,0,0.14), 0px 5px 24px 4px rgba(0,0,0,0.12) !important; + box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 13px 19px 2px rgba(0, 0, 0, 0.14), 0px 5px 24px 4px rgba(0, 0, 0, 0.12) !important; } + .elevation-14 { - box-shadow: 0px 7px 9px -4px rgba(0,0,0,0.2), 0px 14px 21px 2px rgba(0,0,0,0.14), 0px 5px 26px 4px rgba(0,0,0,0.12) !important; + box-shadow: 0px 7px 9px -4px rgba(0, 0, 0, 0.2), 0px 14px 21px 2px rgba(0, 0, 0, 0.14), 0px 5px 26px 4px rgba(0, 0, 0, 0.12) !important; } + .elevation-15 { - box-shadow: 0px 8px 9px -5px rgba(0,0,0,0.2), 0px 15px 22px 2px rgba(0,0,0,0.14), 0px 6px 28px 5px rgba(0,0,0,0.12) !important; + box-shadow: 0px 8px 9px -5px rgba(0, 0, 0, 0.2), 0px 15px 22px 2px rgba(0, 0, 0, 0.14), 0px 6px 28px 5px rgba(0, 0, 0, 0.12) !important; } + .elevation-16 { - box-shadow: 0px 8px 10px -5px rgba(0,0,0,0.2), 0px 16px 24px 2px rgba(0,0,0,0.14), 0px 6px 30px 5px rgba(0,0,0,0.12) !important; + box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12) !important; } + .elevation-17 { - box-shadow: 0px 8px 11px -5px rgba(0,0,0,0.2), 0px 17px 26px 2px rgba(0,0,0,0.14), 0px 6px 32px 5px rgba(0,0,0,0.12) !important; + box-shadow: 0px 8px 11px -5px rgba(0, 0, 0, 0.2), 0px 17px 26px 2px rgba(0, 0, 0, 0.14), 0px 6px 32px 5px rgba(0, 0, 0, 0.12) !important; } + .elevation-18 { - box-shadow: 0px 9px 11px -5px rgba(0,0,0,0.2), 0px 18px 28px 2px rgba(0,0,0,0.14), 0px 7px 34px 6px rgba(0,0,0,0.12) !important; + box-shadow: 0px 9px 11px -5px rgba(0, 0, 0, 0.2), 0px 18px 28px 2px rgba(0, 0, 0, 0.14), 0px 7px 34px 6px rgba(0, 0, 0, 0.12) !important; } + .elevation-19 { - box-shadow: 0px 9px 12px -6px rgba(0,0,0,0.2), 0px 19px 29px 2px rgba(0,0,0,0.14), 0px 7px 36px 6px rgba(0,0,0,0.12) !important; + box-shadow: 0px 9px 12px -6px rgba(0, 0, 0, 0.2), 0px 19px 29px 2px rgba(0, 0, 0, 0.14), 0px 7px 36px 6px rgba(0, 0, 0, 0.12) !important; } + .elevation-20 { - box-shadow: 0px 10px 13px -6px rgba(0,0,0,0.2), 0px 20px 31px 3px rgba(0,0,0,0.14), 0px 8px 38px 7px rgba(0,0,0,0.12) !important; + box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 20px 31px 3px rgba(0, 0, 0, 0.14), 0px 8px 38px 7px rgba(0, 0, 0, 0.12) !important; } + .elevation-21 { - box-shadow: 0px 10px 13px -6px rgba(0,0,0,0.2), 0px 21px 33px 3px rgba(0,0,0,0.14), 0px 8px 40px 7px rgba(0,0,0,0.12) !important; + box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 21px 33px 3px rgba(0, 0, 0, 0.14), 0px 8px 40px 7px rgba(0, 0, 0, 0.12) !important; } + .elevation-22 { - box-shadow: 0px 10px 14px -6px rgba(0,0,0,0.2), 0px 22px 35px 3px rgba(0,0,0,0.14), 0px 8px 42px 7px rgba(0,0,0,0.12) !important; + box-shadow: 0px 10px 14px -6px rgba(0, 0, 0, 0.2), 0px 22px 35px 3px rgba(0, 0, 0, 0.14), 0px 8px 42px 7px rgba(0, 0, 0, 0.12) !important; } + .elevation-23 { - box-shadow: 0px 11px 14px -7px rgba(0,0,0,0.2), 0px 23px 36px 3px rgba(0,0,0,0.14), 0px 9px 44px 8px rgba(0,0,0,0.12) !important; + box-shadow: 0px 11px 14px -7px rgba(0, 0, 0, 0.2), 0px 23px 36px 3px rgba(0, 0, 0, 0.14), 0px 9px 44px 8px rgba(0, 0, 0, 0.12) !important; } + .elevation-24 { - box-shadow: 0px 11px 15px -7px rgba(0,0,0,0.2), 0px 24px 38px 3px rgba(0,0,0,0.14), 0px 9px 46px 8px rgba(0,0,0,0.12) !important; + box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12) !important; } + html { - box-sizing: border-box; - overflow-y: scroll; /* All browsers without overlaying scrollbars */ - -webkit-text-size-adjust: 100%; /* iOS 8+ */ + box-sizing: border-box; + overflow-y: scroll; /* All browsers without overlaying scrollbars */ + -webkit-text-size-adjust: 100%; /* iOS 8+ */ } + *, ::before, ::after { - box-sizing: inherit; + box-sizing: inherit; } + ::before, ::after { - text-decoration: inherit; /* Inherit text-decoration and vertical align to ::before and ::after pseudo elements */ - vertical-align: inherit; + text-decoration: inherit; /* Inherit text-decoration and vertical align to ::before and ::after pseudo elements */ + vertical-align: inherit; } + * { - background-repeat: no-repeat; /* Set `background-repeat: no-repeat` to all elements */ - padding: 0; /* Reset `padding` and `margin` of all elements */ - margin: 0; + background-repeat: no-repeat; /* Set `background-repeat: no-repeat` to all elements */ + padding: 0; /* Reset `padding` and `margin` of all elements */ + margin: 0; } + audio:not([controls]) { - display: none; - height: 0; + display: none; + height: 0; } + hr { - overflow: visible; /* Show the overflow in Edge and IE */ + overflow: visible; /* Show the overflow in Edge and IE */ } + article, aside, details, @@ -2214,3655 +2767,4430 @@ menu, nav, section, summary { - display: block; + display: block; } + summary { - display: list-item; /* Add the correct display in all browsers */ + display: list-item; /* Add the correct display in all browsers */ } + small { - font-size: 80%; /* Set font-size to 80% in `small` elements */ + font-size: 80%; /* Set font-size to 80% in `small` elements */ } + [hidden], template { - display: none; /* Add the correct display in IE */ + display: none; /* Add the correct display in IE */ } + abbr[title] { - border-bottom: 1px dotted; /* Add a bordered underline effect in all browsers */ - text-decoration: none; /* Remove text decoration in Firefox 40+ */ + border-bottom: 1px dotted; /* Add a bordered underline effect in all browsers */ + text-decoration: none; /* Remove text decoration in Firefox 40+ */ } + a { - background-color: transparent; /* Remove the gray background on active links in IE 10 */ - -webkit-text-decoration-skip: objects; /* Remove gaps in links underline in iOS 8+ and Safari 8+ */ + background-color: transparent; /* Remove the gray background on active links in IE 10 */ + -webkit-text-decoration-skip: objects; /* Remove gaps in links underline in iOS 8+ and Safari 8+ */ } + a:active, a:hover { - outline-width: 0; /* Remove the outline when hovering in all browsers */ + outline-width: 0; /* Remove the outline when hovering in all browsers */ } + code, kbd, pre, samp { - font-family: monospace, monospace; /* Specify the font family of code elements */ + font-family: monospace, monospace; /* Specify the font family of code elements */ } + b, strong { - font-weight: bolder; /* Correct style set to `bold` in Edge 12+, Safari 6.2+, and Chrome 18+ */ + font-weight: bolder; /* Correct style set to `bold` in Edge 12+, Safari 6.2+, and Chrome 18+ */ } + dfn { - font-style: italic; /* Address styling not present in Safari and Chrome */ + font-style: italic; /* Address styling not present in Safari and Chrome */ } + mark { - background-color: #ff0; - color: #000; + background-color: #ff0; + color: #000; } + sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + sub { - bottom: -0.25em; + bottom: -0.25em; } + sup { - top: -0.5em; + top: -0.5em; } + input { - border-radius: 0; + border-radius: 0; } + button, [type="button"], [type="reset"], [type="submit"], [role="button"] { - cursor: pointer; + cursor: pointer; } + [disabled] { - cursor: default; + cursor: default; } + [type="number"] { - width: auto; /* Firefox 36+ */ + width: auto; /* Firefox 36+ */ } + [type="search"] { - -webkit-appearance: textfield; /* Safari 8+ */ + -webkit-appearance: textfield; /* Safari 8+ */ } + [type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { - -webkit-appearance: none; /* Safari 8 */ + -webkit-appearance: none; /* Safari 8 */ } + textarea { - overflow: auto; /* Internet Explorer 11+ */ - resize: vertical; /* Specify textarea resizability */ + overflow: auto; /* Internet Explorer 11+ */ + resize: vertical; /* Specify textarea resizability */ } + button, input, optgroup, select, textarea { - font: inherit; /* Specify font inheritance of form elements */ + font: inherit; /* Specify font inheritance of form elements */ } + optgroup { - font-weight: bold; /* Restore the font weight unset by the previous rule. */ + font-weight: bold; /* Restore the font weight unset by the previous rule. */ } + button { - overflow: visible; /* Address `overflow` set to `hidden` in IE 8/9/10/11 */ + overflow: visible; /* Address `overflow` set to `hidden` in IE 8/9/10/11 */ } + button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { - border-style: 0; - padding: 0; + border-style: 0; + padding: 0; } + button:-moz-focusring, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { - outline: 0; - border: 0; + outline: 0; + border: 0; } + button, html [type="button"], [type="reset"], [type="submit"] { - -webkit-appearance: button; /* Correct the inability to style clickable types in iOS */ + -webkit-appearance: button; /* Correct the inability to style clickable types in iOS */ } + button, select { - text-transform: none; /* Firefox 40+, Internet Explorer 11- */ + text-transform: none; /* Firefox 40+, Internet Explorer 11- */ } + button, input, select, textarea { - background-color: transparent; - border-style: none; - color: inherit; + background-color: transparent; + border-style: none; + color: inherit; } + select { - -moz-appearance: none; /* Firefox 36+ */ - -webkit-appearance: none; /* Chrome 41+ */ + -moz-appearance: none; /* Firefox 36+ */ + -webkit-appearance: none; /* Chrome 41+ */ } + select::-ms-expand { - display: none; /* Internet Explorer 11+ */ + display: none; /* Internet Explorer 11+ */ } + select::-ms-value { - color: currentColor; /* Internet Explorer 11+ */ + color: currentColor; /* Internet Explorer 11+ */ } + legend { - border: 0; /* Correct `color` not being inherited in IE 8/9/10/11 */ - color: inherit; /* Correct the color inheritance from `fieldset` elements in IE */ - display: table; /* Correct the text wrapping in Edge and IE */ - max-width: 100%; /* Correct the text wrapping in Edge and IE */ - white-space: normal; /* Correct the text wrapping in Edge and IE */ + border: 0; /* Correct `color` not being inherited in IE 8/9/10/11 */ + color: inherit; /* Correct the color inheritance from `fieldset` elements in IE */ + display: table; /* Correct the text wrapping in Edge and IE */ + max-width: 100%; /* Correct the text wrapping in Edge and IE */ + white-space: normal; /* Correct the text wrapping in Edge and IE */ } + ::-webkit-file-upload-button { - -webkit-appearance: button; /* Correct the inability to style clickable types in iOS and Safari */ - font: inherit; /* Change font properties to `inherit` in Chrome and Safari */ + -webkit-appearance: button; /* Correct the inability to style clickable types in iOS and Safari */ + font: inherit; /* Change font properties to `inherit` in Chrome and Safari */ } + [type="search"] { - -webkit-appearance: textfield; /* Correct the odd appearance in Chrome and Safari */ - outline-offset: -2px; /* Correct the outline style in Safari */ + -webkit-appearance: textfield; /* Correct the odd appearance in Chrome and Safari */ + outline-offset: -2px; /* Correct the outline style in Safari */ } + img { - border-style: none; /* Remove border when inside `a` element in IE 8/9/10 */ + border-style: none; /* Remove border when inside `a` element in IE 8/9/10 */ } + progress { - vertical-align: baseline; + vertical-align: baseline; } + svg:not(:root) { - overflow: hidden; /* Internet Explorer 11- */ + overflow: hidden; /* Internet Explorer 11- */ } + audio, canvas, progress, video { - display: inline-block; /* Internet Explorer 11+, Windows Phone 8.1+ */ + display: inline-block; /* Internet Explorer 11+, Windows Phone 8.1+ */ } + [aria-busy="true"] { - cursor: progress; + cursor: progress; } + [aria-controls] { - cursor: pointer; + cursor: pointer; } + [aria-disabled] { - cursor: default; + cursor: default; } + ::-moz-selection { - background-color: #b3d4fc; /* Required when declaring ::selection */ - color: #000; - text-shadow: none; + background-color: #b3d4fc; /* Required when declaring ::selection */ + color: #000; + text-shadow: none; } + ::selection { - background-color: #b3d4fc; /* Required when declaring ::selection */ - color: #000; - text-shadow: none; + background-color: #b3d4fc; /* Required when declaring ::selection */ + color: #000; + text-shadow: none; } + .bottom-sheet-transition-enter { - -webkit-transform: translateY(100%); - transform: translateY(100%); + -webkit-transform: translateY(100%); + transform: translateY(100%); } + .bottom-sheet-transition-leave-to { - -webkit-transform: translateY(100%); - transform: translateY(100%); + -webkit-transform: translateY(100%); + transform: translateY(100%); } + .carousel-transition-enter { - -webkit-transform: translate(100%, 0); - transform: translate(100%, 0); + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0); } + .carousel-transition-leave, .carousel-transition-leave-to { - position: absolute; - top: 0; - -webkit-transform: translate(-100%, 0); - transform: translate(-100%, 0); + position: absolute; + top: 0; + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0); } + .carousel-reverse-transition-enter { - -webkit-transform: translate(-100%, 0); - transform: translate(-100%, 0); + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0); } + .carousel-reverse-transition-leave, .carousel-reverse-transition-leave-to { - position: absolute; - top: 0; - -webkit-transform: translate(100%, 0); - transform: translate(100%, 0); + position: absolute; + top: 0; + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0); } + .dialog-transition-enter, .dialog-transition-leave-to { - -webkit-transform: scale(0.5); - transform: scale(0.5); - opacity: 0; + -webkit-transform: scale(0.5); + transform: scale(0.5); + opacity: 0; } + .dialog-transition-enter-to, .dialog-transition-leave { - opacity: 1; + opacity: 1; } + .dialog-bottom-transition-enter, .dialog-bottom-transition-leave-to { - -webkit-transform: translateY(100%); - transform: translateY(100%); + -webkit-transform: translateY(100%); + transform: translateY(100%); } + .picker-transition-enter-active, .picker-reverse-transition-enter-active, .picker-transition-leave-active, .picker-reverse-transition-leave-active { - transition: 0.3s cubic-bezier(0, 0, 0.2, 1); + transition: 0.3s cubic-bezier(0, 0, 0.2, 1); } + .picker-transition-enter, .picker-reverse-transition-enter, .picker-transition-leave-to, .picker-reverse-transition-leave-to { - opacity: 0; + opacity: 0; } + .picker-transition-leave, .picker-reverse-transition-leave, .picker-transition-leave-active, .picker-reverse-transition-leave-active, .picker-transition-leave-to, .picker-reverse-transition-leave-to { - position: absolute !important; + position: absolute !important; } + .picker-transition-enter { - -webkit-transform: translate(0, 100%); - transform: translate(0, 100%); + -webkit-transform: translate(0, 100%); + transform: translate(0, 100%); } + .picker-transition-leave-to { - -webkit-transform: translate(0, -100%); - transform: translate(0, -100%); + -webkit-transform: translate(0, -100%); + transform: translate(0, -100%); } + .picker-reverse-transition-enter { - -webkit-transform: translate(0, -100%); - transform: translate(0, -100%); + -webkit-transform: translate(0, -100%); + transform: translate(0, -100%); } + .picker-reverse-transition-leave-to { - -webkit-transform: translate(0, 100%); - transform: translate(0, 100%); + -webkit-transform: translate(0, 100%); + transform: translate(0, 100%); } + .picker-title-transition-enter-to, .picker-title-transition-leave { - -webkit-transform: translate(0, 0); - transform: translate(0, 0); + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } + .picker-title-transition-enter { - -webkit-transform: translate(-100%, 0); - transform: translate(-100%, 0); + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0); } + .picker-title-transition-leave-to { - opacity: 0; - -webkit-transform: translate(100%, 0); - transform: translate(100%, 0); + opacity: 0; + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0); } + .picker-title-transition-leave, .picker-title-transition-leave-to, .picker-title-transition-leave-active { - position: absolute !important; + position: absolute !important; } + .tab-transition-enter { - -webkit-transform: translate(100%, 0); - transform: translate(100%, 0); + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0); } + .tab-transition-leave, .tab-transition-leave-active { - position: absolute; - top: 0; + position: absolute; + top: 0; } + .tab-transition-leave-to { - position: absolute; - -webkit-transform: translate(-100%, 0); - transform: translate(-100%, 0); + position: absolute; + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0); } + .tab-reverse-transition-enter { - -webkit-transform: translate(-100%, 0); - transform: translate(-100%, 0); + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0); } + .tab-reverse-transition-leave, .tab-reverse-transition-leave-to { - top: 0; - position: absolute; - -webkit-transform: translate(100%, 0); - transform: translate(100%, 0); + top: 0; + position: absolute; + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0); } + .expand-transition-enter-active, .expand-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .expand-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .scale-transition-enter-active, .scale-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .scale-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .scale-transition-enter, .scale-transition-leave, .scale-transition-leave-to { - opacity: 0; - -webkit-transform: scale(0); - transform: scale(0); + opacity: 0; + -webkit-transform: scale(0); + transform: scale(0); } + .message-transition-enter-active, .message-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .message-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .message-transition-enter, .message-transition-leave-to { - opacity: 0; - -webkit-transform: translateY(-15px); - transform: translateY(-15px); + opacity: 0; + -webkit-transform: translateY(-15px); + transform: translateY(-15px); } + .message-transition-leave, .message-transition-leave-active { - position: absolute; + position: absolute; } + .slide-y-transition-enter-active, .slide-y-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .slide-y-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .slide-y-transition-enter, .slide-y-transition-leave-to { - opacity: 0; - -webkit-transform: translateY(-15px); - transform: translateY(-15px); + opacity: 0; + -webkit-transform: translateY(-15px); + transform: translateY(-15px); } + .slide-y-reverse-transition-enter-active, .slide-y-reverse-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .slide-y-reverse-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .slide-y-reverse-transition-enter, .slide-y-reverse-transition-leave-to { - opacity: 0; - -webkit-transform: translateY(15px); - transform: translateY(15px); + opacity: 0; + -webkit-transform: translateY(15px); + transform: translateY(15px); } + .scroll-y-transition-enter-active, .scroll-y-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .scroll-y-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .scroll-y-transition-enter, .scroll-y-transition-leave-to { - opacity: 0; + opacity: 0; } + .scroll-y-transition-enter { - -webkit-transform: translateY(-15px); - transform: translateY(-15px); + -webkit-transform: translateY(-15px); + transform: translateY(-15px); } + .scroll-y-transition-leave-to { - -webkit-transform: translateY(15px); - transform: translateY(15px); + -webkit-transform: translateY(15px); + transform: translateY(15px); } + .scroll-y-reverse-transition-enter-active, .scroll-y-reverse-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .scroll-y-reverse-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .scroll-y-reverse-transition-enter, .scroll-y-reverse-transition-leave-to { - opacity: 0; + opacity: 0; } + .scroll-y-reverse-transition-enter { - -webkit-transform: translateY(15px); - transform: translateY(15px); + -webkit-transform: translateY(15px); + transform: translateY(15px); } + .scroll-y-reverse-transition-leave-to { - -webkit-transform: translateY(-15px); - transform: translateY(-15px); + -webkit-transform: translateY(-15px); + transform: translateY(-15px); } + .scroll-x-transition-enter-active, .scroll-x-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .scroll-x-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .scroll-x-transition-enter, .scroll-x-transition-leave-to { - opacity: 0; + opacity: 0; } + .scroll-x-transition-enter { - -webkit-transform: translateX(-15px); - transform: translateX(-15px); + -webkit-transform: translateX(-15px); + transform: translateX(-15px); } + .scroll-x-transition-leave-to { - -webkit-transform: translateX(15px); - transform: translateX(15px); + -webkit-transform: translateX(15px); + transform: translateX(15px); } + .scroll-x-reverse-transition-enter-active, .scroll-x-reverse-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .scroll-x-reverse-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .scroll-x-reverse-transition-enter, .scroll-x-reverse-transition-leave-to { - opacity: 0; + opacity: 0; } + .scroll-x-reverse-transition-enter { - -webkit-transform: translateX(15px); - transform: translateX(15px); + -webkit-transform: translateX(15px); + transform: translateX(15px); } + .scroll-x-reverse-transition-leave-to { - -webkit-transform: translateX(-15px); - transform: translateX(-15px); + -webkit-transform: translateX(-15px); + transform: translateX(-15px); } + .slide-x-transition-enter-active, .slide-x-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .slide-x-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .slide-x-transition-enter, .slide-x-transition-leave-to { - opacity: 0; - -webkit-transform: translateX(-15px); - transform: translateX(-15px); + opacity: 0; + -webkit-transform: translateX(-15px); + transform: translateX(-15px); } + .slide-x-reverse-transition-enter-active, .slide-x-reverse-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .slide-x-reverse-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .slide-x-reverse-transition-enter, .slide-x-reverse-transition-leave-to { - opacity: 0; - -webkit-transform: translateX(15px); - transform: translateX(15px); + opacity: 0; + -webkit-transform: translateX(15px); + transform: translateX(15px); } + .fade-transition-enter-active, .fade-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .fade-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .fade-transition-enter, .fade-transition-leave-to { - opacity: 0; + opacity: 0; } + .fab-transition-enter-active, .fab-transition-leave-active { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .fab-transition-move { - transition: -webkit-transform 0.6s; - transition: transform 0.6s; - transition: transform 0.6s, -webkit-transform 0.6s; + transition: -webkit-transform 0.6s; + transition: transform 0.6s; + transition: transform 0.6s, -webkit-transform 0.6s; } + .fab-transition-enter, .fab-transition-leave-to { - -webkit-transform: scale(0) rotate(-45deg); - transform: scale(0) rotate(-45deg); + -webkit-transform: scale(0) rotate(-45deg); + transform: scale(0) rotate(-45deg); } + .blockquote { - padding: 16px 0 16px 24px; - font-size: 18px; - font-weight: 300; + padding: 16px 0 16px 24px; + font-size: 18px; + font-weight: 300; } + code, kbd { - display: inline-block; - border-radius: 3px; - white-space: pre-wrap; - font-size: 85%; - font-weight: 900; + display: inline-block; + border-radius: 3px; + white-space: pre-wrap; + font-size: 85%; + font-weight: 900; } + code:after, kbd:after, code:before, kbd:before { - content: "\A0"; - letter-spacing: -1px; + content: "\A0"; + letter-spacing: -1px; } + code { - background-color: #f5f5f5; - color: #bd4147; - box-shadow: 0px 2px 1px -1px rgba(0,0,0,0.2), 0px 1px 1px 0px rgba(0,0,0,0.14), 0px 1px 3px 0px rgba(0,0,0,0.12); + background-color: #f5f5f5; + color: #bd4147; + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); } + kbd { - background: #424242; - color: #fff; + background: #424242; + color: #fff; } + html { - font-size: 14px; - overflow-x: hidden; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-tap-highlight-color: rgba(0,0,0,0); + font-size: 14px; + overflow-x: hidden; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + .application { - font-family: 'Roboto', sans-serif; - line-height: 1.5; + font-family: 'Roboto', sans-serif; + line-height: 1.5; } + ::-ms-clear, ::-ms-reveal { - display: none; + display: none; } + ul, ol { - padding-left: 24px; + padding-left: 24px; } + .display-4 { - font-size: 112px !important; - font-weight: 300; - line-height: 1 !important; - letter-spacing: -0.04em !important; - font-family: 'Roboto', sans-serif !important; + font-size: 112px !important; + font-weight: 300; + line-height: 1 !important; + letter-spacing: -0.04em !important; + font-family: 'Roboto', sans-serif !important; } + .display-3 { - font-size: 56px !important; - font-weight: 400; - line-height: 1.35 !important; - letter-spacing: -0.02em !important; - font-family: 'Roboto', sans-serif !important; + font-size: 56px !important; + font-weight: 400; + line-height: 1.35 !important; + letter-spacing: -0.02em !important; + font-family: 'Roboto', sans-serif !important; } + .display-2 { - font-size: 45px !important; - font-weight: 400; - line-height: 48px !important; - letter-spacing: normal !important; - font-family: 'Roboto', sans-serif !important; + font-size: 45px !important; + font-weight: 400; + line-height: 48px !important; + letter-spacing: normal !important; + font-family: 'Roboto', sans-serif !important; } + .display-1 { - font-size: 34px !important; - font-weight: 400; - line-height: 40px !important; - letter-spacing: normal !important; - font-family: 'Roboto', sans-serif !important; + font-size: 34px !important; + font-weight: 400; + line-height: 40px !important; + letter-spacing: normal !important; + font-family: 'Roboto', sans-serif !important; } + .headline { - font-size: 24px !important; - font-weight: 400; - line-height: 32px !important; - letter-spacing: normal !important; - font-family: 'Roboto', sans-serif !important; + font-size: 24px !important; + font-weight: 400; + line-height: 32px !important; + letter-spacing: normal !important; + font-family: 'Roboto', sans-serif !important; } + .title { - font-size: 20px !important; - font-weight: 500; - line-height: 1 !important; - letter-spacing: 0.02em !important; - font-family: 'Roboto', sans-serif !important; + font-size: 20px !important; + font-weight: 500; + line-height: 1 !important; + letter-spacing: 0.02em !important; + font-family: 'Roboto', sans-serif !important; } + .subheading { - font-size: 16px !important; - font-weight: 400; + font-size: 16px !important; + font-weight: 400; } + .body-2 { - font-size: 14px !important; - font-weight: 500; + font-size: 14px !important; + font-weight: 500; } + .body-1 { - font-size: 14px !important; - font-weight: 400; + font-size: 14px !important; + font-weight: 400; } + .caption { - font-size: 12px !important; - font-weight: 400; + font-size: 12px !important; + font-weight: 400; } + .v-btn { - font-size: 14px; - font-weight: 500; + font-size: 14px; + font-weight: 500; } + p { - margin-bottom: 16px; + margin-bottom: 16px; } + .overflow-hidden { - overflow: hidden; + overflow: hidden; } + .overflow-x-hidden { - overflow-x: hidden; + overflow-x: hidden; } + .overflow-y-hidden { - overflow-y: hidden; + overflow-y: hidden; } + .right { - float: right !important; + float: right !important; } + .left { - float: left !important; + float: left !important; } + .ma-auto { - margin-top: auto !important; - margin-right: auto !important; - margin-bottom: auto !important; - margin-left: auto !important; + margin-top: auto !important; + margin-right: auto !important; + margin-bottom: auto !important; + margin-left: auto !important; } + .my-auto { - margin-top: auto !important; - margin-bottom: auto !important; + margin-top: auto !important; + margin-bottom: auto !important; } + .mx-auto { - margin-left: auto !important; - margin-right: auto !important; + margin-left: auto !important; + margin-right: auto !important; } + .mt-auto { - margin-top: auto; + margin-top: auto; } + .mr-auto { - margin-right: auto; + margin-right: auto; } + .mb-auto { - margin-bottom: auto; + margin-bottom: auto; } + .ml-auto { - margin-left: auto; + margin-left: auto; } + .ma-0 { - margin: 0 0 !important; + margin: 0 0 !important; } + .my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; + margin-top: 0 !important; + margin-bottom: 0 !important; } + .mx-0 { - margin-left: 0 !important; - margin-right: 0 !important; + margin-left: 0 !important; + margin-right: 0 !important; } + .mt-0 { - margin-top: 0 !important; + margin-top: 0 !important; } + .mr-0 { - margin-right: 0 !important; + margin-right: 0 !important; } + .mb-0 { - margin-bottom: 0 !important; + margin-bottom: 0 !important; } + .ml-0 { - margin-left: 0 !important; + margin-left: 0 !important; } + .pa-0 { - padding: 0 0 !important; + padding: 0 0 !important; } + .py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; + padding-top: 0 !important; + padding-bottom: 0 !important; } + .px-0 { - padding-left: 0 !important; - padding-right: 0 !important; + padding-left: 0 !important; + padding-right: 0 !important; } + .pt-0 { - padding-top: 0 !important; + padding-top: 0 !important; } + .pr-0 { - padding-right: 0 !important; + padding-right: 0 !important; } + .pb-0 { - padding-bottom: 0 !important; + padding-bottom: 0 !important; } + .pl-0 { - padding-left: 0 !important; + padding-left: 0 !important; } + .ma-1 { - margin: 4px 4px !important; + margin: 4px 4px !important; } + .my-1 { - margin-top: 4px !important; - margin-bottom: 4px !important; + margin-top: 4px !important; + margin-bottom: 4px !important; } + .mx-1 { - margin-left: 4px !important; - margin-right: 4px !important; + margin-left: 4px !important; + margin-right: 4px !important; } + .mt-1 { - margin-top: 4px !important; + margin-top: 4px !important; } + .mr-1 { - margin-right: 4px !important; + margin-right: 4px !important; } + .mb-1 { - margin-bottom: 4px !important; + margin-bottom: 4px !important; } + .ml-1 { - margin-left: 4px !important; + margin-left: 4px !important; } + .pa-1 { - padding: 4px 4px !important; + padding: 4px 4px !important; } + .py-1 { - padding-top: 4px !important; - padding-bottom: 4px !important; + padding-top: 4px !important; + padding-bottom: 4px !important; } + .px-1 { - padding-left: 4px !important; - padding-right: 4px !important; + padding-left: 4px !important; + padding-right: 4px !important; } + .pt-1 { - padding-top: 4px !important; + padding-top: 4px !important; } + .pr-1 { - padding-right: 4px !important; + padding-right: 4px !important; } + .pb-1 { - padding-bottom: 4px !important; + padding-bottom: 4px !important; } + .pl-1 { - padding-left: 4px !important; + padding-left: 4px !important; } + .ma-2 { - margin: 8px 8px !important; + margin: 8px 8px !important; } + .my-2 { - margin-top: 8px !important; - margin-bottom: 8px !important; + margin-top: 8px !important; + margin-bottom: 8px !important; } + .mx-2 { - margin-left: 8px !important; - margin-right: 8px !important; + margin-left: 8px !important; + margin-right: 8px !important; } + .mt-2 { - margin-top: 8px !important; + margin-top: 8px !important; } + .mr-2 { - margin-right: 8px !important; + margin-right: 8px !important; } + .mb-2 { - margin-bottom: 8px !important; + margin-bottom: 8px !important; } + .ml-2 { - margin-left: 8px !important; + margin-left: 8px !important; } + .pa-2 { - padding: 8px 8px !important; + padding: 8px 8px !important; } + .py-2 { - padding-top: 8px !important; - padding-bottom: 8px !important; + padding-top: 8px !important; + padding-bottom: 8px !important; } + .px-2 { - padding-left: 8px !important; - padding-right: 8px !important; + padding-left: 8px !important; + padding-right: 8px !important; } + .pt-2 { - padding-top: 8px !important; + padding-top: 8px !important; } + .pr-2 { - padding-right: 8px !important; + padding-right: 8px !important; } + .pb-2 { - padding-bottom: 8px !important; + padding-bottom: 8px !important; } + .pl-2 { - padding-left: 8px !important; + padding-left: 8px !important; } + .ma-3 { - margin: 16px 16px !important; + margin: 16px 16px !important; } + .my-3 { - margin-top: 16px !important; - margin-bottom: 16px !important; + margin-top: 16px !important; + margin-bottom: 16px !important; } + .mx-3 { - margin-left: 16px !important; - margin-right: 16px !important; + margin-left: 16px !important; + margin-right: 16px !important; } + .mt-3 { - margin-top: 16px !important; + margin-top: 16px !important; } + .mr-3 { - margin-right: 16px !important; + margin-right: 16px !important; } + .mb-3 { - margin-bottom: 16px !important; + margin-bottom: 16px !important; } + .ml-3 { - margin-left: 16px !important; + margin-left: 16px !important; } + .pa-3 { - padding: 16px 16px !important; + padding: 16px 16px !important; } + .py-3 { - padding-top: 16px !important; - padding-bottom: 16px !important; + padding-top: 16px !important; + padding-bottom: 16px !important; } + .px-3 { - padding-left: 16px !important; - padding-right: 16px !important; + padding-left: 16px !important; + padding-right: 16px !important; } + .pt-3 { - padding-top: 16px !important; + padding-top: 16px !important; } + .pr-3 { - padding-right: 16px !important; + padding-right: 16px !important; } + .pb-3 { - padding-bottom: 16px !important; + padding-bottom: 16px !important; } + .pl-3 { - padding-left: 16px !important; + padding-left: 16px !important; } + .ma-4 { - margin: 24px 24px !important; + margin: 24px 24px !important; } + .my-4 { - margin-top: 24px !important; - margin-bottom: 24px !important; + margin-top: 24px !important; + margin-bottom: 24px !important; } + .mx-4 { - margin-left: 24px !important; - margin-right: 24px !important; + margin-left: 24px !important; + margin-right: 24px !important; } + .mt-4 { - margin-top: 24px !important; + margin-top: 24px !important; } + .mr-4 { - margin-right: 24px !important; + margin-right: 24px !important; } + .mb-4 { - margin-bottom: 24px !important; + margin-bottom: 24px !important; } + .ml-4 { - margin-left: 24px !important; + margin-left: 24px !important; } + .pa-4 { - padding: 24px 24px !important; + padding: 24px 24px !important; } + .py-4 { - padding-top: 24px !important; - padding-bottom: 24px !important; + padding-top: 24px !important; + padding-bottom: 24px !important; } + .px-4 { - padding-left: 24px !important; - padding-right: 24px !important; + padding-left: 24px !important; + padding-right: 24px !important; } + .pt-4 { - padding-top: 24px !important; + padding-top: 24px !important; } + .pr-4 { - padding-right: 24px !important; + padding-right: 24px !important; } + .pb-4 { - padding-bottom: 24px !important; + padding-bottom: 24px !important; } + .pl-4 { - padding-left: 24px !important; + padding-left: 24px !important; } + .ma-5 { - margin: 48px 48px !important; + margin: 48px 48px !important; } + .my-5 { - margin-top: 48px !important; - margin-bottom: 48px !important; + margin-top: 48px !important; + margin-bottom: 48px !important; } + .mx-5 { - margin-left: 48px !important; - margin-right: 48px !important; + margin-left: 48px !important; + margin-right: 48px !important; } + .mt-5 { - margin-top: 48px !important; + margin-top: 48px !important; } + .mr-5 { - margin-right: 48px !important; + margin-right: 48px !important; } + .mb-5 { - margin-bottom: 48px !important; + margin-bottom: 48px !important; } + .ml-5 { - margin-left: 48px !important; + margin-left: 48px !important; } + .pa-5 { - padding: 48px 48px !important; + padding: 48px 48px !important; } + .py-5 { - padding-top: 48px !important; - padding-bottom: 48px !important; + padding-top: 48px !important; + padding-bottom: 48px !important; } + .px-5 { - padding-left: 48px !important; - padding-right: 48px !important; + padding-left: 48px !important; + padding-right: 48px !important; } + .pt-5 { - padding-top: 48px !important; + padding-top: 48px !important; } + .pr-5 { - padding-right: 48px !important; + padding-right: 48px !important; } + .pb-5 { - padding-bottom: 48px !important; + padding-bottom: 48px !important; } + .pl-5 { - padding-left: 48px !important; + padding-left: 48px !important; } + .font-weight-thin { - font-weight: 100 !important; + font-weight: 100 !important; } + .font-weight-light { - font-weight: 300 !important; + font-weight: 300 !important; } + .font-weight-regular { - font-weight: 400 !important; + font-weight: 400 !important; } + .font-weight-medium { - font-weight: 500 !important; + font-weight: 500 !important; } + .font-weight-bold { - font-weight: 700 !important; + font-weight: 700 !important; } + .font-weight-black { - font-weight: 900 !important; + font-weight: 900 !important; } + .font-italic { - font-style: italic !important; + font-style: italic !important; } + .text-capitalize { - text-transform: capitalize !important; + text-transform: capitalize !important; } + .text-lowercase { - text-transform: lowercase !important; + text-transform: lowercase !important; } + .text-uppercase { - text-transform: uppercase !important; + text-transform: uppercase !important; } + .text-no-wrap { - white-space: nowrap !important; + white-space: nowrap !important; } + .text-truncate { - white-space: nowrap !important; - overflow: hidden !important; - text-overflow: ellipsis !important; + white-space: nowrap !important; + overflow: hidden !important; + text-overflow: ellipsis !important; } + .transition-fast-out-slow-in { - transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; + transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; } + .transition-linear-out-slow-in { - transition: 0.3s cubic-bezier(0, 0, 0.2, 1) !important; + transition: 0.3s cubic-bezier(0, 0, 0.2, 1) !important; } + .transition-fast-out-linear-in { - transition: 0.3s cubic-bezier(0.4, 0, 1, 1) !important; + transition: 0.3s cubic-bezier(0.4, 0, 1, 1) !important; } + .transition-ease-in-out { - transition: 0.3s cubic-bezier(0.4, 0, 0.6, 1) !important; + transition: 0.3s cubic-bezier(0.4, 0, 0.6, 1) !important; } + .transition-fast-in-fast-out { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1) !important; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1) !important; } + .transition-swing { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1) !important; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1) !important; } + @media screen { - [hidden~="screen"] { - display: inherit; - } - [hidden~="screen"]:not(:active):not(:focus):not(:target) { - position: absolute !important; - clip: rect(0 0 0 0) !important; - } + [hidden~="screen"] { + display: inherit; + } + + [hidden~="screen"]:not(:active):not(:focus):not(:target) { + position: absolute !important; + clip: rect(0 0 0 0) !important; + } } + @media only screen and (max-width: 599px) { - .hidden-xs-only { - display: none !important; - } + .hidden-xs-only { + display: none !important; + } } + @media only screen and (min-width: 600px) and (max-width: 959px) { - .hidden-sm-only { - display: none !important; - } + .hidden-sm-only { + display: none !important; + } } + @media only screen and (max-width: 959px) { - .hidden-sm-and-down { - display: none !important; - } + .hidden-sm-and-down { + display: none !important; + } } + @media only screen and (min-width: 600px) { - .hidden-sm-and-up { - display: none !important; - } + .hidden-sm-and-up { + display: none !important; + } } + @media only screen and (min-width: 960px) and (max-width: 1263px) { - .hidden-md-only { - display: none !important; - } + .hidden-md-only { + display: none !important; + } } + @media only screen and (max-width: 1263px) { - .hidden-md-and-down { - display: none !important; - } + .hidden-md-and-down { + display: none !important; + } } + @media only screen and (min-width: 960px) { - .hidden-md-and-up { - display: none !important; - } + .hidden-md-and-up { + display: none !important; + } } + @media only screen and (min-width: 1264px) and (max-width: 1903px) { - .hidden-lg-only { - display: none !important; - } + .hidden-lg-only { + display: none !important; + } } + @media only screen and (max-width: 1903px) { - .hidden-lg-and-down { - display: none !important; - } + .hidden-lg-and-down { + display: none !important; + } } + @media only screen and (min-width: 1264px) { - .hidden-lg-and-up { - display: none !important; - } + .hidden-lg-and-up { + display: none !important; + } } + @media only screen and (min-width: 1904px) { - .hidden-xl-only { - display: none !important; - } + .hidden-xl-only { + display: none !important; + } } + @media all and (min-width: 0) { - .text-xs-left { - text-align: left !important; - } - .text-xs-center { - text-align: center !important; - } - .text-xs-right { - text-align: right !important; - } - .text-xs-justify { - text-align: justify !important; - } + .text-xs-left { + text-align: left !important; + } + + .text-xs-center { + text-align: center !important; + } + + .text-xs-right { + text-align: right !important; + } + + .text-xs-justify { + text-align: justify !important; + } } + @media all and (min-width: 600px) { - .text-sm-left { - text-align: left !important; - } - .text-sm-center { - text-align: center !important; - } - .text-sm-right { - text-align: right !important; - } - .text-sm-justify { - text-align: justify !important; - } + .text-sm-left { + text-align: left !important; + } + + .text-sm-center { + text-align: center !important; + } + + .text-sm-right { + text-align: right !important; + } + + .text-sm-justify { + text-align: justify !important; + } } + @media all and (min-width: 960px) { - .text-md-left { - text-align: left !important; - } - .text-md-center { - text-align: center !important; - } - .text-md-right { - text-align: right !important; - } - .text-md-justify { - text-align: justify !important; - } + .text-md-left { + text-align: left !important; + } + + .text-md-center { + text-align: center !important; + } + + .text-md-right { + text-align: right !important; + } + + .text-md-justify { + text-align: justify !important; + } } + @media all and (min-width: 1264px) { - .text-lg-left { - text-align: left !important; - } - .text-lg-center { - text-align: center !important; - } - .text-lg-right { - text-align: right !important; - } - .text-lg-justify { - text-align: justify !important; - } + .text-lg-left { + text-align: left !important; + } + + .text-lg-center { + text-align: center !important; + } + + .text-lg-right { + text-align: right !important; + } + + .text-lg-justify { + text-align: justify !important; + } } + @media all and (min-width: 1904px) { - .text-xl-left { - text-align: left !important; - } - .text-xl-center { - text-align: center !important; - } - .text-xl-right { - text-align: right !important; - } - .text-xl-justify { - text-align: justify !important; - } + .text-xl-left { + text-align: left !important; + } + + .text-xl-center { + text-align: center !important; + } + + .text-xl-right { + text-align: right !important; + } + + .text-xl-justify { + text-align: justify !important; + } } .application { - display: flex; + display: flex; } + .application a { - cursor: pointer; + cursor: pointer; } + .application--is-rtl { - direction: rtl; + direction: rtl; } + .application--wrap { - flex: 1 1 auto; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - display: flex; - flex-direction: column; - min-height: 100vh; - max-width: 100%; - position: relative; + flex: 1 1 auto; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + display: flex; + flex-direction: column; + min-height: 100vh; + max-width: 100%; + position: relative; } + .theme--light.application { - background: #fafafa; - color: rgba(0,0,0,0.87); + background: #fafafa; + color: rgba(0, 0, 0, 0.87); } + .theme--light.application .text--primary { - color: rgba(0,0,0,0.87) !important; + color: rgba(0, 0, 0, 0.87) !important; } + .theme--light.application .text--secondary { - color: rgba(0,0,0,0.54) !important; + color: rgba(0, 0, 0, 0.54) !important; } + .theme--light.application .text--disabled { - color: rgba(0,0,0,0.38) !important; + color: rgba(0, 0, 0, 0.38) !important; } + .theme--dark.application { - background: #303030; - color: #fff; + background: #303030; + color: #fff; } + .theme--dark.application .text--primary { - color: #fff !important; + color: #fff !important; } + .theme--dark.application .text--secondary { - color: rgba(255,255,255,0.7) !important; + color: rgba(255, 255, 255, 0.7) !important; } + .theme--dark.application .text--disabled { - color: rgba(255,255,255,0.5) !important; + color: rgba(255, 255, 255, 0.5) !important; } + @-moz-document url-prefix() { } + @media print { - @-moz-document url-prefix() { - .application { - display: block; + @-moz-document url-prefix() { + .application { + display: block; + } + .application--wrap { + display: block; + } } - .application--wrap { - display: block; - } - } } .v-alert { - border-radius: 0; - border-width: 4px 0 0 0; - border-style: solid; - color: #fff; - display: flex; - font-size: 14px; - margin: 4px auto; - padding: 16px; - position: relative; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + border-radius: 0; + border-width: 4px 0 0 0; + border-style: solid; + color: #fff; + display: flex; + font-size: 14px; + margin: 4px auto; + padding: 16px; + position: relative; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-alert .v-alert__icon.v-icon, .v-alert__dismissible .v-icon { - align-self: center; - color: rgba(0,0,0,0.3); - font-size: 24px; + align-self: center; + color: rgba(0, 0, 0, 0.3); + font-size: 24px; } + .v-alert--outline .v-icon { - color: inherit !important; + color: inherit !important; } + .v-alert__icon { - margin-right: 16px; + margin-right: 16px; } + .v-alert__dismissible { - align-self: flex-start; - color: inherit; - margin-left: 16px; - margin-right: 0; - text-decoration: none; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + align-self: flex-start; + color: inherit; + margin-left: 16px; + margin-right: 0; + text-decoration: none; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-alert__dismissible:hover { - opacity: 0.8; + opacity: 0.8; } + .v-alert--no-icon .v-alert__icon { - display: none; + display: none; } + .v-alert > div { - align-self: center; - flex: 1 1; + align-self: center; + flex: 1 1; } + .v-alert.v-alert { - border-color: rgba(0,0,0,0.12) !important; + border-color: rgba(0, 0, 0, 0.12) !important; } + .v-alert.v-alert--outline { - border: 1px solid currentColor !important; + border: 1px solid currentColor !important; } + @media screen and (max-width: 600px) { - .v-alert__icon { - display: none; - } + .v-alert__icon { + display: none; + } } /* Themes */ .theme--light.v-icon { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-icon.v-icon--disabled { - color: rgba(0,0,0,0.38) !important; + color: rgba(0, 0, 0, 0.38) !important; } + .theme--dark.v-icon { - color: #fff; + color: #fff; } + .theme--dark.v-icon.v-icon--disabled { - color: rgba(255,255,255,0.5) !important; + color: rgba(255, 255, 255, 0.5) !important; } + .v-icon { - align-items: center; - display: inline-flex; - -webkit-font-feature-settings: 'liga'; - font-feature-settings: 'liga'; - font-size: 24px; - justify-content: center; - line-height: 1; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - vertical-align: text-bottom; + align-items: center; + display: inline-flex; + -webkit-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; + font-size: 24px; + justify-content: center; + line-height: 1; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + vertical-align: text-bottom; } + .v-icon.v-icon.v-icon--link { - cursor: pointer; + cursor: pointer; } + .v-icon.v-icon--large { - font-size: 2.5rem; + font-size: 2.5rem; } + .v-icon.v-icon--medium { - font-size: 2rem; + font-size: 2rem; } + .v-icon.v-icon--x-large { - font-size: 3rem; + font-size: 3rem; } + .v-icon.v-icon--disabled { - pointer-events: none; + pointer-events: none; } .v-autocomplete.v-input > .v-input__control > .v-input__slot { - cursor: text; + cursor: text; } + .v-autocomplete input { - align-self: center; + align-self: center; } + .v-autocomplete--is-selecting-index input { - opacity: 0; + opacity: 0; } + .v-autocomplete.v-text-field--enclosed:not(.v-text-field--solo):not(.v-text-field--single-line) .v-select__slot > input { - margin-top: 24px; + margin-top: 24px; } + .v-autocomplete:not(.v-input--is-disabled).v-select.v-text-field input { - pointer-events: auto; + pointer-events: auto; } + .v-autocomplete__content.v-menu__content { - border-radius: 0; + border-radius: 0; } + .v-autocomplete__content.v-menu__content .v-card { - border-radius: 0; + border-radius: 0; } .theme--light.v-text-field .v-input__slot:before { - border-color: rgba(0,0,0,0.42); + border-color: rgba(0, 0, 0, 0.42); } + .theme--light.v-text-field:not(.v-input--has-state) .v-input__slot:hover:before { - border-color: rgba(0,0,0,0.87); + border-color: rgba(0, 0, 0, 0.87); } + .theme--light.v-text-field.v-input--is-disabled .v-input__slot:before { - border-image: repeating-linear-gradient(to right, rgba(0,0,0,0.38) 0px, rgba(0,0,0,0.38) 2px, transparent 2px, transparent 4px) 1 repeat; + border-image: repeating-linear-gradient(to right, rgba(0, 0, 0, 0.38) 0px, rgba(0, 0, 0, 0.38) 2px, transparent 2px, transparent 4px) 1 repeat; } + .theme--light.v-text-field__prefix, .theme--light.v-text-field__suffix { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-text-field--solo .v-input__slot { - border-radius: 2px; - background: #fff; + border-radius: 2px; + background: #fff; } + .theme--light.v-text-field--solo-inverted.v-text-field--solo .v-input__slot { - background: rgba(0,0,0,0.16); + background: rgba(0, 0, 0, 0.16); } + .theme--light.v-text-field--solo-inverted.v-text-field--solo.v-input--is-focused .v-input__slot { - background: #424242; + background: #424242; } + .theme--light.v-text-field--solo-inverted.v-text-field--solo.v-input--is-focused .v-input__slot .v-label, .theme--light.v-text-field--solo-inverted.v-text-field--solo.v-input--is-focused .v-input__slot input { - color: #fff; + color: #fff; } + .theme--light.v-text-field--box .v-input__slot { - background: rgba(0,0,0,0.06); + background: rgba(0, 0, 0, 0.06); } + .theme--light.v-text-field--box:not(.v-input--is-focused) .v-input__slot:hover { - background: rgba(0,0,0,0.12); + background: rgba(0, 0, 0, 0.12); } + .theme--light.v-text-field--outline .v-input__slot { - border: 2px solid rgba(0,0,0,0.54); + border: 2px solid rgba(0, 0, 0, 0.54); } + .theme--light.v-text-field--outline:not(.v-input--is-focused) .v-input__slot:hover { - border: 2px solid rgba(0,0,0,0.87); + border: 2px solid rgba(0, 0, 0, 0.87); } + .theme--dark.v-text-field .v-input__slot:before { - border-color: rgba(255,255,255,0.7); + border-color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-text-field:not(.v-input--has-state) .v-input__slot:hover:before { - border-color: #fff; + border-color: #fff; } + .theme--dark.v-text-field.v-input--is-disabled .v-input__slot:before { - border-image: repeating-linear-gradient(to right, rgba(255,255,255,0.5) 0px, rgba(255,255,255,0.5) 2px, transparent 2px, transparent 4px) 1 repeat; + border-image: repeating-linear-gradient(to right, rgba(255, 255, 255, 0.5) 0px, rgba(255, 255, 255, 0.5) 2px, transparent 2px, transparent 4px) 1 repeat; } + .theme--dark.v-text-field__prefix, .theme--dark.v-text-field__suffix { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-text-field--solo .v-input__slot { - border-radius: 2px; - background: #424242; + border-radius: 2px; + background: #424242; } + .theme--dark.v-text-field--solo-inverted.v-text-field--solo .v-input__slot { - background: rgba(255,255,255,0.16); + background: rgba(255, 255, 255, 0.16); } + .theme--dark.v-text-field--solo-inverted.v-text-field--solo.v-input--is-focused .v-input__slot { - background: #fff; + background: #fff; } + .theme--dark.v-text-field--solo-inverted.v-text-field--solo.v-input--is-focused .v-input__slot .v-label, .theme--dark.v-text-field--solo-inverted.v-text-field--solo.v-input--is-focused .v-input__slot input { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--dark.v-text-field--box .v-input__slot { - background: rgba(0,0,0,0.1); + background: rgba(0, 0, 0, 0.1); } + .theme--dark.v-text-field--box:not(.v-input--is-focused) .v-input__slot:hover { - background: rgba(0,0,0,0.2); + background: rgba(0, 0, 0, 0.2); } + .theme--dark.v-text-field--outline .v-input__slot { - border: 2px solid rgba(255,255,255,0.7); + border: 2px solid rgba(255, 255, 255, 0.7); } + .theme--dark.v-text-field--outline:not(.v-input--is-focused) .v-input__slot:hover { - border: 2px solid #fff; + border: 2px solid #fff; } + .application--is-rtl .v-text-field .v-label { - -webkit-transform-origin: top right; - transform-origin: top right; + -webkit-transform-origin: top right; + transform-origin: top right; } + .application--is-rtl .v-text-field .v-counter { - margin-left: 0; - margin-right: 8px; + margin-left: 0; + margin-right: 8px; } + .application--is-rtl .v-text-field--enclosed .v-input__append-outer { - margin-left: 0; - margin-right: 16px; + margin-left: 0; + margin-right: 16px; } + .application--is-rtl .v-text-field--enclosed .v-input__prepend-outer { - margin-left: 16px; - margin-right: 0; + margin-left: 16px; + margin-right: 0; } + .application--is-rtl .v-text-field--reverse input { - text-align: left; + text-align: left; } + .application--is-rtl .v-text-field--reverse .v-label { - -webkit-transform-origin: top left; - transform-origin: top left; + -webkit-transform-origin: top left; + transform-origin: top left; } + .application--is-rtl .v-text-field__prefix { - text-align: left; - padding-right: 0; - padding-left: 4px; + text-align: left; + padding-right: 0; + padding-left: 4px; } + .application--is-rtl .v-text-field__suffix { - padding-left: 0; - padding-right: 4px; + padding-left: 0; + padding-right: 4px; } + .application--is-rtl .v-text-field--reverse .v-text-field__prefix { - text-align: right; - padding-left: 0; - padding-right: 4px; + text-align: right; + padding-left: 0; + padding-right: 4px; } + .application--is-rtl .v-text-field--reverse .v-text-field__suffix { - padding-left: 0; - padding-right: 4px; + padding-left: 0; + padding-right: 4px; } + .v-text-field { - padding-top: 12px; - margin-top: 4px; + padding-top: 12px; + margin-top: 4px; } + .v-text-field input { - flex: 1 1 auto; - line-height: 20px; - padding: 8px 0 8px; - max-width: 100%; - min-width: 0px; - width: 100%; + flex: 1 1 auto; + line-height: 20px; + padding: 8px 0 8px; + max-width: 100%; + min-width: 0px; + width: 100%; } + .v-text-field .v-input__prepend-inner, .v-text-field .v-input__append-inner { - align-self: flex-start; - display: inline-flex; - margin-top: 4px; - line-height: 1; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + align-self: flex-start; + display: inline-flex; + margin-top: 4px; + line-height: 1; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-text-field .v-input__prepend-inner { - margin-right: auto; - padding-right: 4px; + margin-right: auto; + padding-right: 4px; } + .v-text-field .v-input__append-inner { - margin-left: auto; - padding-left: 4px; + margin-left: auto; + padding-left: 4px; } + .v-text-field .v-counter { - margin-left: 8px; - white-space: nowrap; + margin-left: 8px; + white-space: nowrap; } + .v-text-field .v-label { - max-width: 90%; - overflow: hidden; - text-overflow: ellipsis; - top: 6px; - -webkit-transform-origin: top left; - transform-origin: top left; - white-space: nowrap; - pointer-events: none; + max-width: 90%; + overflow: hidden; + text-overflow: ellipsis; + top: 6px; + -webkit-transform-origin: top left; + transform-origin: top left; + white-space: nowrap; + pointer-events: none; } + .v-text-field .v-label--active { - max-width: 100%; - -webkit-transform: translateY(-18px) scale(0.75); - transform: translateY(-18px) scale(0.75); + max-width: 100%; + -webkit-transform: translateY(-18px) scale(0.75); + transform: translateY(-18px) scale(0.75); } + .v-text-field > .v-input__control > .v-input__slot { - cursor: text; - transition: background 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + cursor: text; + transition: background 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-text-field > .v-input__control > .v-input__slot:before, .v-text-field > .v-input__control > .v-input__slot:after { - bottom: -1px; - content: ''; - left: 0; - position: absolute; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - width: 100%; + bottom: -1px; + content: ''; + left: 0; + position: absolute; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + width: 100%; } + .v-text-field > .v-input__control > .v-input__slot:before { - border-style: solid; - border-width: thin 0 0 0; + border-style: solid; + border-width: thin 0 0 0; } + .v-text-field > .v-input__control > .v-input__slot:after { - border-color: currentColor; - border-style: solid; - border-width: thin 0 thin 0; - -webkit-transform: scaleX(0); - transform: scaleX(0); + border-color: currentColor; + border-style: solid; + border-width: thin 0 thin 0; + -webkit-transform: scaleX(0); + transform: scaleX(0); } + .v-text-field__details { - display: flex; - flex: 1 0 auto; - max-width: 100%; - overflow: hidden; + display: flex; + flex: 1 0 auto; + max-width: 100%; + overflow: hidden; } + .v-text-field__prefix, .v-text-field__suffix { - align-self: center; - cursor: default; + align-self: center; + cursor: default; } + .v-text-field__prefix { - width: 16px; - text-align: right; - padding-right: 4px; + width: 16px; + text-align: right; + padding-right: 4px; } + .v-text-field__suffix { - padding-left: 4px; - white-space: nowrap; + padding-left: 4px; + white-space: nowrap; } + .v-text-field--reverse .v-text-field__prefix { - text-align: left; - padding-right: 0; - padding-left: 4px; + text-align: left; + padding-right: 0; + padding-left: 4px; } + .v-text-field--reverse .v-text-field__suffix { - padding-left: 0; - padding-right: 4px; + padding-left: 0; + padding-right: 4px; } + .v-text-field__slot { - display: flex; - flex: 1 1 auto; - position: relative; + display: flex; + flex: 1 1 auto; + position: relative; } + .v-text-field--box, .v-text-field--outline { - position: relative; + position: relative; } + .v-text-field--box .v-input__slot, .v-text-field--outline .v-input__slot { - align-items: stretch; + align-items: stretch; } + .v-text-field--box input, .v-text-field--outline input { - margin-top: 22px; + margin-top: 22px; } + .v-text-field--box.v-text-field--single-line input, .v-text-field--outline.v-text-field--single-line input { - margin-top: 12px; + margin-top: 12px; } + .v-text-field--box .v-label, .v-text-field--outline .v-label { - top: 18px; + top: 18px; } + .v-text-field--box .v-label--active, .v-text-field--outline .v-label--active { - -webkit-transform: translateY(-6px) scale(0.75); - transform: translateY(-6px) scale(0.75); + -webkit-transform: translateY(-6px) scale(0.75); + transform: translateY(-6px) scale(0.75); } + .v-text-field--box .v-input__slot, .v-text-field--outline .v-input__slot { - min-height: 56px; + min-height: 56px; } + .v-text-field--box .v-input__slot { - border-top-left-radius: 4px; - border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; } + .v-text-field--box .v-input__slot:before { - border-style: solid; - border-width: thin 0 thin 0; + border-style: solid; + border-width: thin 0 thin 0; } + .v-text-field.v-text-field--enclosed { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } + .v-text-field.v-text-field--enclosed:not(.v-text-field--box) .v-progress-linear__background { - display: none; + display: none; } + .v-text-field.v-text-field--enclosed .v-input__prepend-outer, .v-text-field.v-text-field--enclosed .v-input__prepend-inner, .v-text-field.v-text-field--enclosed .v-input__append-inner, .v-text-field.v-text-field--enclosed .v-input__append-outer { - margin-top: 16px; + margin-top: 16px; } + .v-text-field.v-text-field--enclosed .v-text-field__details, .v-text-field.v-text-field--enclosed .v-input__slot { - padding: 0 12px; + padding: 0 12px; } + .v-text-field.v-text-field--enclosed .v-text-field__details { - margin-bottom: 8px; + margin-bottom: 8px; } + .v-text-field.v-text-field--full-width.v-input { - margin-bottom: 0; - margin-top: 0; + margin-bottom: 0; + margin-top: 0; } + .v-text-field.v-text-field--full-width .v-label { - top: calc(50% - 10px); + top: calc(50% - 10px); } + .v-text-field.v-text-field--full-width .v-input__control { - padding: 12px 0; + padding: 12px 0; } + .v-text-field.v-text-field--full-width .v-input__prepend-outer, .v-text-field.v-text-field--full-width .v-input__append-outer { - margin-top: 4px; + margin-top: 4px; } + .v-text-field.v-text-field--full-width .v-input__append-inner { - align-self: center; - margin-top: 0; + align-self: center; + margin-top: 0; } + .v-text-field--reverse input { - text-align: right; + text-align: right; } + .v-text-field--reverse .v-label { - -webkit-transform-origin: top right; - transform-origin: top right; + -webkit-transform-origin: top right; + transform-origin: top right; } + .v-text-field--reverse .v-input__slot, .v-text-field--reverse .v-text-field__slot { - flex-direction: row-reverse; + flex-direction: row-reverse; } + .v-text-field--solo .v-input__slot:before, .v-text-field--outline .v-input__slot:before, .v-text-field--full-width .v-input__slot:before, .v-text-field--solo .v-input__slot:after, .v-text-field--outline .v-input__slot:after, .v-text-field--full-width .v-input__slot:after { - display: none; + display: none; } + .v-text-field--outline { - margin-bottom: 16px; - transition: border 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + margin-bottom: 16px; + transition: border 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-text-field--outline .v-input__slot { - background: transparent !important; - border-radius: 4px; + background: transparent !important; + border-radius: 4px; } + .v-text-field--outline .v-input__prepend-outer, .v-text-field--outline .v-input__append-outer { - margin-top: 18px; + margin-top: 18px; } + .v-text-field--outline.v-input--is-focused .v-input__slot { - border: 2px solid currentColor; - transition: border 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + border: 2px solid currentColor; + transition: border 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-text-field.v-text-field--solo .v-label { - top: calc(50% - 10px); + top: calc(50% - 10px); } + .v-text-field.v-text-field--solo .v-input__control { - min-height: 48px; - padding: 0; + min-height: 48px; + padding: 0; } + .v-text-field.v-text-field--solo:not(.v-text-field--solo-flat) .v-input__slot { - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } + .v-text-field.v-text-field--solo .v-text-field__slot { - align-items: center; + align-items: center; } + .v-text-field.v-text-field--solo .v-input__append-inner, .v-text-field.v-text-field--solo .v-input__prepend-inner { - align-self: center; - margin-top: 0; + align-self: center; + margin-top: 0; } + .v-text-field.v-text-field--solo .v-input__prepend-outer, .v-text-field.v-text-field--solo .v-input__append-outer { - margin-top: 12px; + margin-top: 12px; } + .v-text-field.v-input--is-focused .v-input__slot:after { - -webkit-transform: scaleX(1); - transform: scaleX(1); + -webkit-transform: scaleX(1); + transform: scaleX(1); } + .v-text-field.v-input--has-state .v-input__slot:before { - border-color: currentColor; + border-color: currentColor; } .theme--light.v-select .v-select__selections { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-select.v-input--is-disabled .v-select__selections { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-select .v-chip--disabled, .theme--light.v-select .v-select__selection--disabled { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-select.v-text-field--solo-inverted.v-input--is-focused .v-select__selections { - color: #fff; + color: #fff; } + .theme--dark.v-select .v-select__selections { - color: #fff; + color: #fff; } + .theme--dark.v-select.v-input--is-disabled .v-select__selections { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-select .v-chip--disabled, .theme--dark.v-select .v-select__selection--disabled { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-select.v-text-field--solo-inverted.v-input--is-focused .v-select__selections { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .v-select { - position: relative; + position: relative; } + .v-select > .v-input__control > .v-input__slot { - cursor: pointer; + cursor: pointer; } + .v-select .v-chip { - flex: 0 1 auto; + flex: 0 1 auto; } + .v-select .fade-transition-leave-active { - position: absolute; - left: 0; + position: absolute; + left: 0; } + .v-select.v-input--is-dirty ::-webkit-input-placeholder { - color: transparent !important; + color: transparent !important; } + .v-select.v-input--is-dirty :-ms-input-placeholder { - color: transparent !important; + color: transparent !important; } + .v-select.v-input--is-dirty ::-ms-input-placeholder { - color: transparent !important; + color: transparent !important; } + .v-select.v-input--is-dirty ::placeholder { - color: transparent !important; + color: transparent !important; } + .v-select.v-text-field--enclosed:not(.v-text-field--single-line) .v-select__selections { - padding-top: 24px; + padding-top: 24px; } + .v-select.v-text-field input { - flex: 1 1; - margin-top: 0; - min-width: 0; - pointer-events: none; - position: relative; + flex: 1 1; + margin-top: 0; + min-width: 0; + pointer-events: none; + position: relative; } + .v-select.v-select--is-menu-active .v-input__icon--append .v-icon { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + .v-select.v-select--chips input { - margin: 0; + margin: 0; } + .v-select.v-select--chips .v-select__selections { - min-height: 42px; + min-height: 42px; } + .v-select.v-select--chips.v-select--chips--small .v-select__selections { - min-height: 32px; + min-height: 32px; } + .v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box .v-select__selections, .v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed .v-select__selections { - min-height: 68px; + min-height: 68px; } + .v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box.v-select--chips--small .v-select__selections, .v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed.v-select--chips--small .v-select__selections { - min-height: 56px; + min-height: 56px; } + .v-select.v-text-field--reverse .v-select__slot, .v-select.v-text-field--reverse .v-select__selections { - flex-direction: row-reverse; + flex-direction: row-reverse; } + .v-select__selections { - align-items: center; - display: flex; - flex: 1 1 auto; - flex-wrap: wrap; - line-height: 18px; + align-items: center; + display: flex; + flex: 1 1 auto; + flex-wrap: wrap; + line-height: 18px; } + .v-select__selection { - max-width: 90%; + max-width: 90%; } + .v-select__selection--comma { - align-items: center; - display: inline-flex; - margin: 7px 4px 7px 0; + align-items: center; + display: inline-flex; + margin: 7px 4px 7px 0; } + .v-select__slot { - position: relative; - align-items: center; - display: flex; - width: 100%; + position: relative; + align-items: center; + display: flex; + width: 100%; } + .v-select:not(.v-text-field--single-line) .v-select__slot > input { - align-self: flex-end; + align-self: flex-end; } .theme--light.v-chip { - background: #e0e0e0; - color: rgba(0,0,0,0.87); + background: #e0e0e0; + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-chip--disabled { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--dark.v-chip { - background: #fff; - color: rgba(0,0,0,0.87); + background: #fff; + color: rgba(0, 0, 0, 0.87); } + .theme--dark.v-chip--disabled { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .v-chip { - align-items: center; - border-radius: 28px; - border: 1px solid transparent; - display: inline-flex; - font-size: 13px; - margin: 4px; - outline: none; - position: relative; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - vertical-align: middle; + align-items: center; + border-radius: 28px; + border: 1px solid transparent; + display: inline-flex; + font-size: 13px; + margin: 4px; + outline: none; + position: relative; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + vertical-align: middle; } + .v-chip .v-chip__content { - align-items: center; - border-radius: 28px; - cursor: default; - display: inline-flex; - height: 32px; - justify-content: space-between; - padding: 0 12px; - vertical-align: middle; - white-space: nowrap; - z-index: 1; + align-items: center; + border-radius: 28px; + cursor: default; + display: inline-flex; + height: 32px; + justify-content: space-between; + padding: 0 12px; + vertical-align: middle; + white-space: nowrap; + z-index: 1; } + .v-chip--removable .v-chip__content { - padding: 0 4px 0 12px; + padding: 0 4px 0 12px; } + .v-chip .v-avatar { - height: 32px !important; - margin-left: -12px; - margin-right: 8px; - min-width: 32px; - width: 32px !important; + height: 32px !important; + margin-left: -12px; + margin-right: 8px; + min-width: 32px; + width: 32px !important; } + .v-chip .v-avatar img { - height: 100%; - width: 100%; + height: 100%; + width: 100%; } + .v-chip:focus:not(.v-chip--disabled), .v-chip--active, .v-chip--selected { - border-color: rgba(0,0,0,0.13); - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); + border-color: rgba(0, 0, 0, 0.13); + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } + .v-chip:focus:not(.v-chip--disabled):after, .v-chip--active:after, .v-chip--selected:after { - background: currentColor; - border-radius: inherit; - content: ''; - height: 100%; - position: absolute; - top: 0; - left: 0; - transition: inherit; - width: 100%; - pointer-events: none; - opacity: 0.13; + background: currentColor; + border-radius: inherit; + content: ''; + height: 100%; + position: absolute; + top: 0; + left: 0; + transition: inherit; + width: 100%; + pointer-events: none; + opacity: 0.13; } + .v-chip--label { - border-radius: 2px; + border-radius: 2px; } + .v-chip--label .v-chip__content { - border-radius: 2px; + border-radius: 2px; } + .v-chip.v-chip.v-chip--outline { - background: transparent !important; - border-color: currentColor; - color: #9e9e9e; + background: transparent !important; + border-color: currentColor; + color: #9e9e9e; } + .v-chip--small { - height: 24px; + height: 24px; } + .v-chip--small .v-avatar { - height: 24px; - min-width: 24px; - width: 24px; + height: 24px; + min-width: 24px; + width: 24px; } + .v-chip--small .v-icon { - font-size: 20px; + font-size: 20px; } + .v-chip__close { - align-items: center; - color: inherit; - display: flex; - font-size: 20px; - margin: 0 2px 0 8px; - text-decoration: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + align-items: center; + color: inherit; + display: flex; + font-size: 20px; + margin: 0 2px 0 8px; + text-decoration: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-chip__close > .v-icon { - color: inherit !important; - font-size: 20px; - cursor: pointer; - opacity: 0.5; + color: inherit !important; + font-size: 20px; + cursor: pointer; + opacity: 0.5; } + .v-chip__close > .v-icon:hover { - opacity: 1; + opacity: 1; } + .v-chip--disabled .v-chip__close { - pointer-events: none; + pointer-events: none; } + .v-chip--select-multi { - margin: 4px 4px 4px 0; + margin: 4px 4px 4px 0; } + .v-chip .v-icon { - color: inherit; + color: inherit; } + .v-chip .v-icon--right { - margin-left: 12px; - margin-right: -8px; + margin-left: 12px; + margin-right: -8px; } + .v-chip .v-icon--left { - margin-left: -8px; - margin-right: 12px; + margin-left: -8px; + margin-right: 12px; } .v-menu { - display: block; - position: relative; - vertical-align: middle; + display: block; + position: relative; + vertical-align: middle; } + .v-menu--inline { - display: inline-block; + display: inline-block; } + .v-menu__activator { - align-items: center; - cursor: pointer; - display: flex; - position: relative; + align-items: center; + cursor: pointer; + display: flex; + position: relative; } + .v-menu__activator * { - cursor: pointer; + cursor: pointer; } + .v-menu__activator--disabled { - pointer-events: none; + pointer-events: none; } + .v-menu__content { - position: absolute; - display: inline-block; - border-radius: 2px; - max-width: 80%; - overflow-y: auto; - overflow-x: hidden; - contain: content; - will-change: transform; - box-shadow: 0px 5px 5px -3px rgba(0,0,0,0.2), 0px 8px 10px 1px rgba(0,0,0,0.14), 0px 3px 14px 2px rgba(0,0,0,0.12); + position: absolute; + display: inline-block; + border-radius: 2px; + max-width: 80%; + overflow-y: auto; + overflow-x: hidden; + contain: content; + will-change: transform; + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); } + .v-menu__content--active { - pointer-events: none; + pointer-events: none; } + .v-menu__content > .card { - contain: content; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; + contain: content; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + .v-menu > .v-menu__content { - max-width: none; + max-width: none; } + .v-menu-transition-enter .v-list__tile { - min-width: 0; - pointer-events: none; + min-width: 0; + pointer-events: none; } + .v-menu-transition-enter-to .v-list__tile { - pointer-events: auto; - transition-delay: 0.1s; + pointer-events: auto; + transition-delay: 0.1s; } + .v-menu-transition-leave-active, .v-menu-transition-leave-to { - pointer-events: none; + pointer-events: none; } + .v-menu-transition-enter, .v-menu-transition-leave-to { - opacity: 0; + opacity: 0; } + .v-menu-transition-enter-active, .v-menu-transition-leave-active { - transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } + .v-menu-transition-enter.v-menu__content--auto .v-list__tile { - opacity: 0; - -webkit-transform: translateY(-15px); - transform: translateY(-15px); + opacity: 0; + -webkit-transform: translateY(-15px); + transform: translateY(-15px); } + .v-menu-transition-enter.v-menu__content--auto .v-list__tile--active { - opacity: 1; - -webkit-transform: none !important; - transform: none !important; - pointer-events: auto; + opacity: 1; + -webkit-transform: none !important; + transform: none !important; + pointer-events: auto; } /* Themes */ .theme--light.v-card { - background-color: #fff; - color: rgba(0,0,0,0.87); + background-color: #fff; + color: rgba(0, 0, 0, 0.87); } + .theme--dark.v-card { - background-color: #424242; - color: #fff; + background-color: #424242; + color: #fff; } + .v-card { - display: block; - border-radius: 2px; - min-width: 0; - position: relative; - text-decoration: none; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - box-shadow: 0px 2px 1px -1px rgba(0,0,0,0.2), 0px 1px 1px 0px rgba(0,0,0,0.14), 0px 1px 3px 0px rgba(0,0,0,0.12); + display: block; + border-radius: 2px; + min-width: 0; + position: relative; + text-decoration: none; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); } + .v-card > *:first-child:not(.v-btn):not(.v-chip) { - border-top-left-radius: inherit; - border-top-right-radius: inherit; + border-top-left-radius: inherit; + border-top-right-radius: inherit; } + .v-card > *:last-child:not(.v-btn):not(.v-chip) { - border-bottom-left-radius: inherit; - border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; } + .v-card--raised { - box-shadow: 0px 3px 3px -2px rgba(0,0,0,0.2), 0px 3px 4px 0px rgba(0,0,0,0.14), 0px 1px 8px 0px rgba(0,0,0,0.12); + box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); } + .v-card--tile { - border-radius: 0; + border-radius: 0; } + .v-card--flat { - box-shadow: 0px 0px 0px 0px rgba(0,0,0,0.2), 0px 0px 0px 0px rgba(0,0,0,0.14), 0px 0px 0px 0px rgba(0,0,0,0.12); + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); } + .v-card--hover { - cursor: pointer; - transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); - transition-property: box-shadow; + cursor: pointer; + transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); + transition-property: box-shadow; } + .v-card--hover:hover { - box-shadow: 0px 5px 5px -3px rgba(0,0,0,0.2), 0px 8px 10px 1px rgba(0,0,0,0.14), 0px 3px 14px 2px rgba(0,0,0,0.12); + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); } + .v-card__title { - align-items: center; - display: flex; - flex-wrap: wrap; - padding: 16px; + align-items: center; + display: flex; + flex-wrap: wrap; + padding: 16px; } + .v-card__title--primary { - padding-top: 24px; + padding-top: 24px; } + .v-card__text { - padding: 16px; - width: 100%; + padding: 16px; + width: 100%; } + .v-card__actions { - align-items: center; - display: flex; - padding: 8px; + align-items: center; + display: flex; + padding: 8px; } + .v-card__actions > *, .v-card__actions .v-btn { - margin: 0; + margin: 0; } + .v-card__actions .v-btn + .v-btn { - margin-left: 8px; + margin-left: 8px; } /** Theme */ .theme--light.v-input--selection-controls.v-input--is-disabled .v-icon { - color: rgba(0,0,0,0.26) !important; + color: rgba(0, 0, 0, 0.26) !important; } + .theme--dark.v-input--selection-controls.v-input--is-disabled .v-icon { - color: rgba(255,255,255,0.3) !important; + color: rgba(255, 255, 255, 0.3) !important; } + .application--is-rtl .v-input--selection-controls .v-input--selection-controls__input { - margin-right: 0; - margin-left: 8px; + margin-right: 0; + margin-left: 8px; } + .v-input--selection-controls { - margin-top: 16px; - padding-top: 4px; + margin-top: 16px; + padding-top: 4px; } + .v-input--selection-controls .v-input__append-outer, .v-input--selection-controls .v-input__prepend-outer { - margin-top: 0; - margin-bottom: 0; + margin-top: 0; + margin-bottom: 0; } + .v-input--selection-controls .v-input__slot { - margin-bottom: 12px; + margin-bottom: 12px; } + .v-input--selection-controls__input { - color: inherit; - display: inline-flex; - flex: 0 0 auto; - height: 24px; - position: relative; - margin-right: 8px; - transition: color 0.2s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); - transition: color 0.2s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); - transition: color 0.2s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); - width: 24px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + color: inherit; + display: inline-flex; + flex: 0 0 auto; + height: 24px; + position: relative; + margin-right: 8px; + transition: color 0.2s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + transition: color 0.2s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + transition: color 0.2s cubic-bezier(0.25, 0.8, 0.25, 1), transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1), -webkit-transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + width: 24px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-input--selection-controls__input input { - position: absolute; - opacity: 0; - width: 100%; - height: 100%; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + position: absolute; + opacity: 0; + width: 100%; + height: 100%; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-input--selection-controls__input + .v-label { - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-input--selection-controls__ripple { - cursor: pointer; - height: 48px; - position: absolute; - transition: inherit; - width: 48px; - left: -12px; - top: calc(50% - 24px); + cursor: pointer; + height: 48px; + position: absolute; + transition: inherit; + width: 48px; + left: -12px; + top: calc(50% - 24px); } + .v-input--selection-controls__ripple:before { - border-radius: 50%; - bottom: 0; - content: ''; - position: absolute; - opacity: 0.2; - left: 0; - right: 0; - top: 0; - -webkit-transform-origin: center center; - transform-origin: center center; - -webkit-transform: scale(0.2); - transform: scale(0.2); - transition: inherit; + border-radius: 50%; + bottom: 0; + content: ''; + position: absolute; + opacity: 0.2; + left: 0; + right: 0; + top: 0; + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: scale(0.2); + transform: scale(0.2); + transition: inherit; } + .v-input--selection-controls.v-input .v-label { - align-items: center; - display: inline-flex; - top: 0; - height: auto; + align-items: center; + display: inline-flex; + top: 0; + height: auto; } + .v-input--selection-controls.v-input--is-focused .v-input--selection-controls__ripple:before, .v-input--selection-controls .v-radio--is-focused .v-input--selection-controls__ripple:before { - background: currentColor; - -webkit-transform: scale(0.8); - transform: scale(0.8); + background: currentColor; + -webkit-transform: scale(0.8); + transform: scale(0.8); } /* Theme */ .theme--light.v-input:not(.v-input--is-disabled) input, .theme--light.v-input:not(.v-input--is-disabled) textarea { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-input input::-webkit-input-placeholder, .theme--light.v-input textarea::-webkit-input-placeholder { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-input input:-ms-input-placeholder, .theme--light.v-input textarea:-ms-input-placeholder { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-input input::-ms-input-placeholder, .theme--light.v-input textarea::-ms-input-placeholder { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-input input::placeholder, .theme--light.v-input textarea::placeholder { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-input--is-disabled .v-label, .theme--light.v-input--is-disabled input, .theme--light.v-input--is-disabled textarea { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--dark.v-input:not(.v-input--is-disabled) input, .theme--dark.v-input:not(.v-input--is-disabled) textarea { - color: #fff; + color: #fff; } + .theme--dark.v-input input::-webkit-input-placeholder, .theme--dark.v-input textarea::-webkit-input-placeholder { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-input input:-ms-input-placeholder, .theme--dark.v-input textarea:-ms-input-placeholder { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-input input::-ms-input-placeholder, .theme--dark.v-input textarea::-ms-input-placeholder { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-input input::placeholder, .theme--dark.v-input textarea::placeholder { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-input--is-disabled .v-label, .theme--dark.v-input--is-disabled input, .theme--dark.v-input--is-disabled textarea { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .v-input { - align-items: flex-start; - display: flex; - flex: 1 1 auto; - font-size: 16px; - text-align: left; + align-items: flex-start; + display: flex; + flex: 1 1 auto; + font-size: 16px; + text-align: left; } + .v-input .v-progress-linear { - top: calc(100% - 1px); - left: 0; - margin: 0; - position: absolute; + top: calc(100% - 1px); + left: 0; + margin: 0; + position: absolute; } + .v-input input { - max-height: 32px; + max-height: 32px; } + .v-input input:invalid, .v-input textarea:invalid { - box-shadow: none; + box-shadow: none; } + .v-input input:focus, .v-input textarea:focus, .v-input input:active, .v-input textarea:active { - outline: none; + outline: none; } + .v-input .v-label { - height: 20px; - line-height: 20px; + height: 20px; + line-height: 20px; } + .v-input__append-outer, .v-input__prepend-outer { - display: inline-flex; - margin-bottom: 4px; - margin-top: 4px; - line-height: 1; + display: inline-flex; + margin-bottom: 4px; + margin-top: 4px; + line-height: 1; } + .v-input__append-outer .v-icon, .v-input__prepend-outer .v-icon { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-input__append-outer { - margin-left: 9px; + margin-left: 9px; } + .v-input__prepend-outer { - margin-right: 9px; + margin-right: 9px; } + .v-input__control { - display: flex; - flex-direction: column; - height: auto; - flex-grow: 1; - flex-wrap: wrap; - position: relative; - width: 100%; + display: flex; + flex-direction: column; + height: auto; + flex-grow: 1; + flex-wrap: wrap; + position: relative; + width: 100%; } + .v-input__icon { - align-items: center; - display: inline-flex; - height: 24px; - flex: 1 0 auto; - justify-content: center; - min-width: 24px; - width: 24px; + align-items: center; + display: inline-flex; + height: 24px; + flex: 1 0 auto; + justify-content: center; + min-width: 24px; + width: 24px; } + .v-input__icon--clear { - border-radius: 50%; + border-radius: 50%; } + .v-input__slot { - align-items: center; - color: inherit; - display: flex; - margin-bottom: 8px; - min-height: inherit; - position: relative; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - width: 100%; + align-items: center; + color: inherit; + display: flex; + margin-bottom: 8px; + min-height: inherit; + position: relative; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + width: 100%; } + .v-input--is-disabled:not(.v-input--is-readonly) { - pointer-events: none; + pointer-events: none; } + .v-input--is-loading .v-input__slot:before, .v-input--is-loading .v-input__slot:after { - display: none; + display: none; } + .v-input--hide-details .v-input__slot { - margin-bottom: 0; + margin-bottom: 0; } + .v-input--has-state.error--text .v-label { - -webkit-animation: shake 0.6s cubic-bezier(0.25, 0.8, 0.5, 1); - animation: shake 0.6s cubic-bezier(0.25, 0.8, 0.5, 1); + -webkit-animation: shake 0.6s cubic-bezier(0.25, 0.8, 0.5, 1); + animation: shake 0.6s cubic-bezier(0.25, 0.8, 0.5, 1); } .theme--light.v-label { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-label--is-disabled { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--dark.v-label { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-label--is-disabled { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .v-label { - font-size: 16px; - line-height: 1; - min-height: 8px; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + font-size: 16px; + line-height: 1; + min-height: 8px; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } /* Theme */ .theme--light.v-messages { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--dark.v-messages { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .application--is-rtl .v-messages { - text-align: right; + text-align: right; } + .v-messages { - flex: 1 1 auto; - font-size: 12px; - min-height: 12px; - min-width: 1px; - position: relative; + flex: 1 1 auto; + font-size: 12px; + min-height: 12px; + min-width: 1px; + position: relative; } + .v-messages__message { - line-height: 1; - word-break: break-word; - overflow-wrap: break-word; - word-wrap: break-word; - -webkit-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; + line-height: 1; + word-break: break-word; + overflow-wrap: break-word; + word-wrap: break-word; + -webkit-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; } .v-progress-linear { - background: transparent; - margin: 1rem 0; - overflow: hidden; - width: 100%; - position: relative; + background: transparent; + margin: 1rem 0; + overflow: hidden; + width: 100%; + position: relative; } + .v-progress-linear__bar { - width: 100%; - height: inherit; - position: relative; - transition: 0.2s; - z-index: 1; + width: 100%; + height: inherit; + position: relative; + transition: 0.2s; + z-index: 1; } + .v-progress-linear__bar__determinate { - height: inherit; - transition: 0.2s; + height: inherit; + transition: 0.2s; } + .v-progress-linear__bar__indeterminate .long, .v-progress-linear__bar__indeterminate .short { - height: inherit; - position: absolute; - left: 0; - top: 0; - bottom: 0; - will-change: left, right; - width: auto; - background-color: inherit; + height: inherit; + position: absolute; + left: 0; + top: 0; + bottom: 0; + will-change: left, right; + width: auto; + background-color: inherit; } + .v-progress-linear__bar__indeterminate--active .long { - -webkit-animation: indeterminate; - animation: indeterminate; - -webkit-animation-duration: 2.2s; - animation-duration: 2.2s; - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; + -webkit-animation: indeterminate; + animation: indeterminate; + -webkit-animation-duration: 2.2s; + animation-duration: 2.2s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; } + .v-progress-linear__bar__indeterminate--active .short { - -webkit-animation: indeterminate-short; - animation: indeterminate-short; - -webkit-animation-duration: 2.2s; - animation-duration: 2.2s; - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; + -webkit-animation: indeterminate-short; + animation: indeterminate-short; + -webkit-animation-duration: 2.2s; + animation-duration: 2.2s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; } + .v-progress-linear__background { - position: absolute; - top: 0; - left: 0; - bottom: 0; - transition: 0.3s ease-in; + position: absolute; + top: 0; + left: 0; + bottom: 0; + transition: 0.3s ease-in; } + .v-progress-linear--query .v-progress-linear__bar__indeterminate--active .long { - -webkit-animation: query; - animation: query; - -webkit-animation-duration: 2s; - animation-duration: 2s; - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; + -webkit-animation: query; + animation: query; + -webkit-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; } + .v-progress-linear--query .v-progress-linear__bar__indeterminate--active .short { - -webkit-animation: query-short; - animation: query-short; - -webkit-animation-duration: 2s; - animation-duration: 2s; - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; + -webkit-animation: query-short; + animation: query-short; + -webkit-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; } + @-webkit-keyframes indeterminate { - 0% { - left: -90%; - right: 100%; - } - 60% { - left: -90%; - right: 100%; - } - 100% { - left: 100%; - right: -35%; - } + 0% { + left: -90%; + right: 100%; + } + 60% { + left: -90%; + right: 100%; + } + 100% { + left: 100%; + right: -35%; + } } + @keyframes indeterminate { - 0% { - left: -90%; - right: 100%; - } - 60% { - left: -90%; - right: 100%; - } - 100% { - left: 100%; - right: -35%; - } + 0% { + left: -90%; + right: 100%; + } + 60% { + left: -90%; + right: 100%; + } + 100% { + left: 100%; + right: -35%; + } } + @-webkit-keyframes indeterminate-short { - 0% { - left: -200%; - right: 100%; - } - 60% { - left: 107%; - right: -8%; - } - 100% { - left: 107%; - right: -8%; - } + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } } + @keyframes indeterminate-short { - 0% { - left: -200%; - right: 100%; - } - 60% { - left: 107%; - right: -8%; - } - 100% { - left: 107%; - right: -8%; - } + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } } + @-webkit-keyframes query { - 0% { - right: -90%; - left: 100%; - } - 60% { - right: -90%; - left: 100%; - } - 100% { - right: 100%; - left: -35%; - } + 0% { + right: -90%; + left: 100%; + } + 60% { + right: -90%; + left: 100%; + } + 100% { + right: 100%; + left: -35%; + } } + @keyframes query { - 0% { - right: -90%; - left: 100%; - } - 60% { - right: -90%; - left: 100%; - } - 100% { - right: 100%; - left: -35%; - } + 0% { + right: -90%; + left: 100%; + } + 60% { + right: -90%; + left: 100%; + } + 100% { + right: 100%; + left: -35%; + } } + @-webkit-keyframes query-short { - 0% { - right: -200%; - left: 100%; - } - 60% { - right: 107%; - left: -8%; - } - 100% { - right: 107%; - left: -8%; - } + 0% { + right: -200%; + left: 100%; + } + 60% { + right: 107%; + left: -8%; + } + 100% { + right: 107%; + left: -8%; + } } + @keyframes query-short { - 0% { - right: -200%; - left: 100%; - } - 60% { - right: 107%; - left: -8%; - } - 100% { - right: 107%; - left: -8%; - } + 0% { + right: -200%; + left: 100%; + } + 60% { + right: 107%; + left: -8%; + } + 100% { + right: 107%; + left: -8%; + } } .theme--light.v-divider { - border-color: rgba(0,0,0,0.12); + border-color: rgba(0, 0, 0, 0.12); } + .theme--dark.v-divider { - border-color: rgba(255,255,255,0.12); + border-color: rgba(255, 255, 255, 0.12); } + .v-divider { - display: block; - flex: 1 1 0px; - max-width: 100%; - height: 0px; - max-height: 0px; - border: solid; - border-width: thin 0 0 0; - transition: inherit; + display: block; + flex: 1 1 0px; + max-width: 100%; + height: 0px; + max-height: 0px; + border: solid; + border-width: thin 0 0 0; + transition: inherit; } + .v-divider--inset:not(.v-divider--vertical) { - margin-left: 72px; - max-width: calc(100% - 72px); + margin-left: 72px; + max-width: calc(100% - 72px); } + .v-divider--vertical { - align-self: stretch; - border: solid; - border-width: 0 thin 0 0; - display: inline-flex; - height: inherit; - min-height: 100%; - max-height: 100%; - max-width: 0px; - width: 0px; - vertical-align: text-bottom; + align-self: stretch; + border: solid; + border-width: 0 thin 0 0; + display: inline-flex; + height: inherit; + min-height: 100%; + max-height: 100%; + max-width: 0px; + width: 0px; + vertical-align: text-bottom; } + .v-divider--vertical.v-divider--inset { - margin-top: 8px; - min-height: 0; - max-height: calc(100% - 16px); + margin-top: 8px; + min-height: 0; + max-height: calc(100% - 16px); } .theme--light.v-subheader { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--dark.v-subheader { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .v-subheader { - align-items: center; - display: flex; - height: 48px; - font-size: 14px; - font-weight: 500; - padding: 0 16px 0 16px; + align-items: center; + display: flex; + height: 48px; + font-size: 14px; + font-weight: 500; + padding: 0 16px 0 16px; } + .v-subheader--inset { - margin-left: 56px; + margin-left: 56px; } /* Themes */ .theme--light.v-list { - background: #fff; - color: rgba(0,0,0,0.87); + background: #fff; + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-list .v-list--disabled { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-list .v-list__tile__sub-title { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-list .v-list__tile__mask { - color: rgba(0,0,0,0.38); - background: #eee; + color: rgba(0, 0, 0, 0.38); + background: #eee; } + .theme--light.v-list .v-list__tile--link:hover, .theme--light.v-list .v-list__tile--highlighted, .theme--light.v-list .v-list__group__header:hover { - background: rgba(0,0,0,0.04); + background: rgba(0, 0, 0, 0.04); } + .theme--light.v-list .v-list__group--active:before, .theme--light.v-list .v-list__group--active:after { - background: rgba(0,0,0,0.12); + background: rgba(0, 0, 0, 0.12); } + .theme--light.v-list .v-list__group--disabled .v-list__tile { - color: rgba(0,0,0,0.38) !important; + color: rgba(0, 0, 0, 0.38) !important; } + .theme--light.v-list .v-list__group--disabled .v-list__group__header__prepend-icon .v-icon { - color: rgba(0,0,0,0.38) !important; + color: rgba(0, 0, 0, 0.38) !important; } + .theme--dark.v-list { - background: #424242; - color: #fff; + background: #424242; + color: #fff; } + .theme--dark.v-list .v-list--disabled { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-list .v-list__tile__sub-title { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-list .v-list__tile__mask { - color: rgba(255,255,255,0.5); - background: #494949; + color: rgba(255, 255, 255, 0.5); + background: #494949; } + .theme--dark.v-list .v-list__tile--link:hover, .theme--dark.v-list .v-list__tile--highlighted, .theme--dark.v-list .v-list__group__header:hover { - background: rgba(255,255,255,0.08); + background: rgba(255, 255, 255, 0.08); } + .theme--dark.v-list .v-list__group--active:before, .theme--dark.v-list .v-list__group--active:after { - background: rgba(255,255,255,0.12); + background: rgba(255, 255, 255, 0.12); } + .theme--dark.v-list .v-list__group--disabled .v-list__tile { - color: rgba(255,255,255,0.5) !important; + color: rgba(255, 255, 255, 0.5) !important; } + .theme--dark.v-list .v-list__group--disabled .v-list__group__header__prepend-icon .v-icon { - color: rgba(255,255,255,0.5) !important; + color: rgba(255, 255, 255, 0.5) !important; } + .v-list { - list-style-type: none; - padding: 8px 0 8px; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + list-style-type: none; + padding: 8px 0 8px; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-list .v-input .v-messages { - display: none; + display: none; } + .v-list .v-input, .v-list .v-input__slot { - margin: 0; + margin: 0; } + .v-list > div { - transition: inherit; + transition: inherit; } + .v-list__tile { - align-items: center; - color: inherit; - display: flex; - font-size: 16px; - font-weight: 400; - height: 48px; - margin: 0; - padding: 0 16px; - position: relative; - text-decoration: none; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + align-items: center; + color: inherit; + display: flex; + font-size: 16px; + font-weight: 400; + height: 48px; + margin: 0; + padding: 0 16px; + position: relative; + text-decoration: none; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-list__tile--link { - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-list__tile__content, .v-list__tile__action { - height: 100%; + height: 100%; } + .v-list__tile__title, .v-list__tile__sub-title { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + width: 100%; } + .v-list__tile__title { - height: 24px; - line-height: 24px; - position: relative; - text-align: left; + height: 24px; + line-height: 24px; + position: relative; + text-align: left; } + .v-list__tile__sub-title { - font-size: 14px; + font-size: 14px; } + .v-list__tile__avatar { - display: flex; - justify-content: flex-start; - min-width: 56px; + display: flex; + justify-content: flex-start; + min-width: 56px; } + .v-list__tile__action { - display: flex; - justify-content: flex-start; - min-width: 56px; - align-items: center; + display: flex; + justify-content: flex-start; + min-width: 56px; + align-items: center; } + .v-list__tile__action .v-btn { - padding: 0; - margin: 0; + padding: 0; + margin: 0; } + .v-list__tile__action .v-btn--icon { - margin: -6px; + margin: -6px; } + .v-list__tile__action .v-radio.v-radio { - margin: 0; + margin: 0; } + .v-list__tile__action .v-input--selection-controls { - padding: 0; + padding: 0; } + .v-list__tile__action-text { - color: #9e9e9e; - font-size: 12px; + color: #9e9e9e; + font-size: 12px; } + .v-list__tile__action--stack { - align-items: flex-end; - justify-content: space-between; - padding-top: 8px; - padding-bottom: 8px; - white-space: nowrap; - flex-direction: column; + align-items: flex-end; + justify-content: space-between; + padding-top: 8px; + padding-bottom: 8px; + white-space: nowrap; + flex-direction: column; } + .v-list__tile__content { - text-align: left; - flex: 1 1 auto; - overflow: hidden; - display: flex; - align-items: flex-start; - justify-content: center; - flex-direction: column; + text-align: left; + flex: 1 1 auto; + overflow: hidden; + display: flex; + align-items: flex-start; + justify-content: center; + flex-direction: column; } + .v-list__tile__content ~ .v-list__tile__avatar { - justify-content: flex-end; + justify-content: flex-end; } + .v-list__tile__content ~ .v-list__tile__action:not(.v-list__tile__action--stack) { - justify-content: flex-end; + justify-content: flex-end; } + .v-list__tile--active .v-list__tile__action:first-of-type .v-icon { - color: inherit; + color: inherit; } + .v-list__tile--avatar { - height: 56px; + height: 56px; } + .v-list--dense { - padding-top: 4px; - padding-bottom: 4px; + padding-top: 4px; + padding-bottom: 4px; } + .v-list--dense .v-subheader { - font-size: 13px; - height: 40px; + font-size: 13px; + height: 40px; } + .v-list--dense .v-list__group .v-subheader { - height: 40px; + height: 40px; } + .v-list--dense .v-list__tile { - font-size: 13px; + font-size: 13px; } + .v-list--dense .v-list__tile--avatar { - height: 48px; + height: 48px; } + .v-list--dense .v-list__tile:not(.v-list__tile--avatar) { - height: 40px; + height: 40px; } + .v-list--dense .v-list__tile .v-icon { - font-size: 22px; + font-size: 22px; } + .v-list--dense .v-list__tile__sub-title { - font-size: 13px; + font-size: 13px; } + .v-list--disabled { - pointer-events: none; + pointer-events: none; } + .v-list--two-line .v-list__tile { - height: 72px; + height: 72px; } + .v-list--two-line.v-list--dense .v-list__tile { - height: 60px; + height: 60px; } + .v-list--three-line .v-list__tile { - height: 88px; + height: 88px; } + .v-list--three-line .v-list__tile__avatar { - margin-top: -18px; + margin-top: -18px; } + .v-list--three-line .v-list__tile__sub-title { - white-space: initial; - -webkit-line-clamp: 2; - display: -webkit-box; + white-space: initial; + -webkit-line-clamp: 2; + display: -webkit-box; } + .v-list--three-line.v-list--dense .v-list__tile { - height: 76px; + height: 76px; } + .v-list > .v-list__group:before { - top: 0; + top: 0; } + .v-list > .v-list__group:before .v-list__tile__avatar { - margin-top: -14px; + margin-top: -14px; } + .v-list__group { - padding: 0; - position: relative; - transition: inherit; + padding: 0; + position: relative; + transition: inherit; } + .v-list__group:before, .v-list__group:after { - content: ''; - height: 1px; - left: 0; - position: absolute; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - width: 100%; + content: ''; + height: 1px; + left: 0; + position: absolute; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + width: 100%; } + .v-list__group--active ~ .v-list__group:before { - display: none; + display: none; } + .v-list__group__header { - align-items: center; - cursor: pointer; - display: flex; - list-style-type: none; + align-items: center; + cursor: pointer; + display: flex; + list-style-type: none; } + .v-list__group__header > div:not(.v-list__group__header__prepend-icon):not(.v-list__group__header__append-icon) { - flex: 1 0 auto; + flex: 1 0 auto; } + .v-list__group__header .v-list__group__header__append-icon, .v-list__group__header .v-list__group__header__prepend-icon { - padding: 0 16px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + padding: 0 16px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-list__group__header--sub-group { - align-items: center; - display: flex; + align-items: center; + display: flex; } + .v-list__group__header--sub-group div .v-list__tile { - padding-left: 0; + padding-left: 0; } + .v-list__group__header--sub-group .v-list__group__header__prepend-icon { - padding: 0 0 0 40px; - margin-right: 8px; + padding: 0 0 0 40px; + margin-right: 8px; } + .v-list__group__header .v-list__group__header__prepend-icon { - display: flex; - justify-content: flex-start; - min-width: 56px; + display: flex; + justify-content: flex-start; + min-width: 56px; } + .v-list__group__header--active .v-list__group__header__append-icon .v-icon { - -webkit-transform: rotate(-180deg); - transform: rotate(-180deg); + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); } + .v-list__group__header--active .v-list__group__header__prepend-icon .v-icon { - color: inherit; + color: inherit; } + .v-list__group__header--active.v-list__group__header--sub-group .v-list__group__header__prepend-icon .v-icon { - -webkit-transform: rotate(-180deg); - transform: rotate(-180deg); + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); } + .v-list__group__items { - position: relative; - padding: 0; - transition: inherit; + position: relative; + padding: 0; + transition: inherit; } + .v-list__group__items > div { - display: block; + display: block; } + .v-list__group__items--no-action .v-list__tile { - padding-left: 72px; + padding-left: 72px; } + .v-list__group--disabled { - pointer-events: none; + pointer-events: none; } + .v-list--subheader { - padding-top: 0; + padding-top: 0; } .v-avatar { - align-items: center; - border-radius: 50%; - display: inline-flex; - justify-content: center; - position: relative; - text-align: center; - vertical-align: middle; + align-items: center; + border-radius: 50%; + display: inline-flex; + justify-content: center; + position: relative; + text-align: center; + vertical-align: middle; } + .v-avatar img, .v-avatar .v-icon, .v-avatar .v-image { - border-radius: 50%; - display: inline-flex; - height: inherit; - width: inherit; + border-radius: 50%; + display: inline-flex; + height: inherit; + width: inherit; } + .v-avatar--tile { - border-radius: 0; + border-radius: 0; } + .v-avatar--tile img, .v-avatar--tile .v-icon, .v-avatar--tile .v-image { - border-radius: 0; + border-radius: 0; } /* Theme */ .theme--light.v-counter { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--dark.v-counter { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .v-counter { - flex: 0 1 auto; - font-size: 12px; - min-height: 12px; - line-height: 1; + flex: 0 1 auto; + font-size: 12px; + min-height: 12px; + line-height: 1; } .v-badge { - display: inline-block; - position: relative; + display: inline-block; + position: relative; } + .v-badge__badge { - color: #fff; - display: flex; - position: absolute; - font-size: 14px; - top: -11px; - right: -22px; - border-radius: 50%; - height: 22px; - width: 22px; - justify-content: center; - align-items: center; - flex-direction: row; - flex-wrap: wrap; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + color: #fff; + display: flex; + position: absolute; + font-size: 14px; + top: -11px; + right: -22px; + border-radius: 50%; + height: 22px; + width: 22px; + justify-content: center; + align-items: center; + flex-direction: row; + flex-wrap: wrap; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-badge__badge .v-icon { - font-size: 14px; + font-size: 14px; } + .v-badge--overlap .v-badge__badge { - top: -8px; - right: -8px; + top: -8px; + right: -8px; } + .v-badge--overlap.v-badge--left .v-badge__badge { - left: -8px; - right: initial; + left: -8px; + right: initial; } + .v-badge--overlap.v-badge--bottom .v-badge__badge { - bottom: -8px; - top: initial; + bottom: -8px; + top: initial; } + .v-badge--left .v-badge__badge { - left: -22px; + left: -22px; } + .v-badge--bottom .v-badge__badge { - bottom: -11px; - top: initial; + bottom: -11px; + top: initial; } .theme--light.v-bottom-nav { - background-color: #fff; + background-color: #fff; } + .theme--dark.v-bottom-nav { - background-color: #424242; + background-color: #424242; } + .v-bottom-nav { - bottom: 0; - box-shadow: 0 3px 14px 2px rgba(0,0,0,0.12); - display: flex; - left: 0; - justify-content: center; - -webkit-transform: translate(0, 60px); - transform: translate(0, 60px); - transition: all 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); - width: 100%; + bottom: 0; + box-shadow: 0 3px 14px 2px rgba(0, 0, 0, 0.12); + display: flex; + left: 0; + justify-content: center; + -webkit-transform: translate(0, 60px); + transform: translate(0, 60px); + transition: all 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); + width: 100%; } + .v-bottom-nav--absolute { - position: absolute; + position: absolute; } + .v-bottom-nav--active { - -webkit-transform: translate(0, 0); - transform: translate(0, 0); + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } + .v-bottom-nav--fixed { - position: fixed; - z-index: 4; + position: fixed; + z-index: 4; } + .v-bottom-nav .v-btn { - background: transparent !important; - border-radius: 0; - box-shadow: none !important; - font-weight: 400; - height: 100%; - margin: 0; - max-width: 168px; - min-width: 80px; - padding: 8px 12px 10px; - text-transform: none; - opacity: 0.5; - width: 100%; - flex-shrink: 1; + background: transparent !important; + border-radius: 0; + box-shadow: none !important; + font-weight: 400; + height: 100%; + margin: 0; + max-width: 168px; + min-width: 80px; + padding: 8px 12px 10px; + text-transform: none; + opacity: 0.5; + width: 100%; + flex-shrink: 1; } + .v-bottom-nav .v-btn .v-btn__content { - flex-direction: column-reverse; - font-size: 12px; - white-space: nowrap; - will-change: font-size; + flex-direction: column-reverse; + font-size: 12px; + white-space: nowrap; + will-change: font-size; } + .v-bottom-nav .v-btn .v-btn__content i.v-icon { - color: inherit; - margin-bottom: 4px; - transition: all 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); + color: inherit; + margin-bottom: 4px; + transition: all 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-bottom-nav .v-btn .v-btn__content span { - line-height: 1; + line-height: 1; } + .v-bottom-nav .v-btn--active { - opacity: 1; - padding-top: 6px; + opacity: 1; + padding-top: 6px; } + .v-bottom-nav .v-btn--active:before { - background-color: transparent; + background-color: transparent; } + .v-bottom-nav .v-btn--active .v-btn__content { - font-size: 14px; + font-size: 14px; } + .v-bottom-nav .v-btn--active .v-btn__content .v-icon { - -webkit-transform: none; - transform: none; + -webkit-transform: none; + transform: none; } + .v-bottom-nav .v-btn:not(.v-btn--active) { - -webkit-filter: grayscale(100%); - filter: grayscale(100%); + -webkit-filter: grayscale(100%); + filter: grayscale(100%); } + .v-bottom-nav--shift .v-btn__content { - font-size: 14px; + font-size: 14px; } + .v-bottom-nav--shift .v-btn { - transition: all 0.3s; - min-width: 56px; - max-width: 96px; + transition: all 0.3s; + min-width: 56px; + max-width: 96px; } + .v-bottom-nav--shift .v-btn--active { - min-width: 96px; - max-width: 168px; + min-width: 96px; + max-width: 168px; } + .v-bottom-nav--shift .v-btn:not(.v-btn--active) .v-btn__content .v-icon { - -webkit-transform: scale(1, 1) translate(0, 8px); - transform: scale(1, 1) translate(0, 8px); + -webkit-transform: scale(1, 1) translate(0, 8px); + transform: scale(1, 1) translate(0, 8px); } + .v-bottom-nav--shift .v-btn:not(.v-btn--active) .v-btn__content span { - color: transparent; + color: transparent; } .v-bottom-sheet.v-dialog { - align-self: flex-end; - border-radius: 0; - flex: 1 0 100%; - margin: 0; - min-width: 100%; - overflow: visible; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + align-self: flex-end; + border-radius: 0; + flex: 1 0 100%; + margin: 0; + min-width: 100%; + overflow: visible; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } + .v-bottom-sheet.v-dialog.v-bottom-sheet--inset { - max-width: 70%; - min-width: 0; + max-width: 70%; + min-width: 0; } + @media only screen and (max-width: 599px) { - .v-bottom-sheet.v-dialog.v-bottom-sheet--inset { - max-width: none; - } + .v-bottom-sheet.v-dialog.v-bottom-sheet--inset { + max-width: none; + } } .v-dialog { - box-shadow: 0px 11px 15px -7px rgba(0,0,0,0.2), 0px 24px 38px 3px rgba(0,0,0,0.14), 0px 9px 46px 8px rgba(0,0,0,0.12); - border-radius: 2px; - margin: 24px; - overflow-y: auto; - pointer-events: auto; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); - width: 100%; - z-index: inherit; + box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12); + border-radius: 2px; + margin: 24px; + overflow-y: auto; + pointer-events: auto; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + width: 100%; + z-index: inherit; } + .v-dialog__content { - align-items: center; - display: flex; - height: 100%; - justify-content: center; - left: 0; - pointer-events: none; - position: fixed; - top: 0; - transition: 0.2s cubic-bezier(0.25, 0.8, 0.25, 1); - width: 100%; - z-index: 6; - outline: none; + align-items: center; + display: flex; + height: 100%; + justify-content: center; + left: 0; + pointer-events: none; + position: fixed; + top: 0; + transition: 0.2s cubic-bezier(0.25, 0.8, 0.25, 1); + width: 100%; + z-index: 6; + outline: none; } + .v-dialog:not(.v-dialog--fullscreen) { - max-height: 90%; + max-height: 90%; } + .v-dialog__activator { - cursor: pointer; + cursor: pointer; } + .v-dialog__activator * { - cursor: pointer; + cursor: pointer; } + .v-dialog__activator--disabled { - pointer-events: none; + pointer-events: none; } + .v-dialog__container { - display: inline-block; - vertical-align: middle; + display: inline-block; + vertical-align: middle; } + .v-dialog--animated { - -webkit-animation-duration: 0.15s; - animation-duration: 0.15s; - -webkit-animation-name: animate-dialog; - animation-name: animate-dialog; - -webkit-animation-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); - animation-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); + -webkit-animation-duration: 0.15s; + animation-duration: 0.15s; + -webkit-animation-name: animate-dialog; + animation-name: animate-dialog; + -webkit-animation-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); + animation-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); } + .v-dialog--fullscreen { - border-radius: 0; - margin: 0; - height: 100%; - position: fixed; - overflow-y: auto; - top: 0; - left: 0; + border-radius: 0; + margin: 0; + height: 100%; + position: fixed; + overflow-y: auto; + top: 0; + left: 0; } + .v-dialog--fullscreen > .v-card { - min-height: 100%; - min-width: 100%; - margin: 0 !important; - padding: 0 !important; + min-height: 100%; + min-width: 100%; + margin: 0 !important; + padding: 0 !important; } + .v-dialog--scrollable { - display: flex; + display: flex; } + .v-dialog--scrollable > .v-card { - display: flex; - flex: 1 1 auto; - flex-direction: column; + display: flex; + flex: 1 1 auto; + flex-direction: column; } + .v-dialog--scrollable > .v-card > .v-card__title, .v-dialog--scrollable > .v-card > .v-card__actions { - flex: 1 0 auto; + flex: 1 0 auto; } + .v-dialog--scrollable > .v-card > .v-card__text { - overflow-y: auto; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; + overflow-y: auto; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + @-webkit-keyframes animate-dialog { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - -webkit-transform: scale(1.03); - transform: scale(1.03); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.03); + transform: scale(1.03); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } } + @keyframes animate-dialog { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - 50% { - -webkit-transform: scale(1.03); - transform: scale(1.03); - } - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.03); + transform: scale(1.03); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } } .v-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - pointer-events: none; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - z-index: 5; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + z-index: 5; } + .v-overlay--absolute { - position: absolute; + position: absolute; } + .v-overlay:before { - background-color: #212121; - bottom: 0; - content: ''; - height: 100%; - left: 0; - opacity: 0; - position: absolute; - right: 0; - top: 0; - transition: inherit; - transition-delay: 150ms; - width: 100%; + background-color: #212121; + bottom: 0; + content: ''; + height: 100%; + left: 0; + opacity: 0; + position: absolute; + right: 0; + top: 0; + transition: inherit; + transition-delay: 150ms; + width: 100%; } + .v-overlay--active { - pointer-events: auto; - touch-action: none; + pointer-events: auto; + touch-action: none; } + .v-overlay--active:before { - opacity: 0.46; + opacity: 0.46; } .theme--light.v-breadcrumbs li.v-breadcrumbs__divider, .theme--light.v-breadcrumbs li:last-child .v-breadcrumbs__item, .theme--light.v-breadcrumbs li .v-breadcrumbs__item--disabled { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--dark.v-breadcrumbs li.v-breadcrumbs__divider, .theme--dark.v-breadcrumbs li:last-child .v-breadcrumbs__item, .theme--dark.v-breadcrumbs li .v-breadcrumbs__item--disabled { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .v-breadcrumbs { - align-items: center; - display: flex; - flex-wrap: wrap; - flex: 0 1 auto; - list-style-type: none; - margin: 0; - padding: 18px 12px; + align-items: center; + display: flex; + flex-wrap: wrap; + flex: 0 1 auto; + list-style-type: none; + margin: 0; + padding: 18px 12px; } + .v-breadcrumbs li { - align-items: center; - display: inline-flex; - font-size: 14px; + align-items: center; + display: inline-flex; + font-size: 14px; } + .v-breadcrumbs li .v-icon { - font-size: 16px; + font-size: 16px; } + .v-breadcrumbs li:last-child a { - cursor: default; - pointer-events: none; + cursor: default; + pointer-events: none; } + .v-breadcrumbs li:nth-child(even) { - padding: 0 12px; + padding: 0 12px; } + .v-breadcrumbs--large li { - font-size: 16px; + font-size: 16px; } + .v-breadcrumbs--large li .v-icon { - font-size: 16px; + font-size: 16px; } + .v-breadcrumbs__item { - align-items: center; - display: inline-flex; - text-decoration: none; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + align-items: center; + display: inline-flex; + text-decoration: none; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-breadcrumbs__item--disabled { - pointer-events: none; + pointer-events: none; } .v-ripple__container { - color: inherit; - border-radius: inherit; - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; - overflow: hidden; - z-index: 0; - pointer-events: none; - contain: strict; + color: inherit; + border-radius: inherit; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + overflow: hidden; + z-index: 0; + pointer-events: none; + contain: strict; } + .v-ripple__animation { - color: inherit; - position: absolute; - top: 0; - left: 0; - border-radius: 50%; - background: currentColor; - opacity: 0; - transition: 0.4s cubic-bezier(0, 0, 0.2, 1); - pointer-events: none; - overflow: hidden; - will-change: transform, opacity; + color: inherit; + position: absolute; + top: 0; + left: 0; + border-radius: 50%; + background: currentColor; + opacity: 0; + transition: 0.4s cubic-bezier(0, 0, 0.2, 1); + pointer-events: none; + overflow: hidden; + will-change: transform, opacity; } + .v-ripple__animation--enter { - transition: none; + transition: none; } + .v-ripple__animation--visible { - opacity: 0.15; + opacity: 0.15; } + .theme--light.v-btn { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-btn.v-btn--disabled { - color: rgba(0,0,0,0.26) !important; + color: rgba(0, 0, 0, 0.26) !important; } + .theme--light.v-btn.v-btn--disabled .v-icon, .theme--light.v-btn.v-btn--disabled .v-btn__loading { - color: rgba(0,0,0,0.26) !important; + color: rgba(0, 0, 0, 0.26) !important; } + .theme--light.v-btn.v-btn--disabled:not(.v-btn--icon):not(.v-btn--flat) { - background-color: rgba(0,0,0,0.12) !important; + background-color: rgba(0, 0, 0, 0.12) !important; } + .theme--light.v-btn:not(.v-btn--icon):not(.v-btn--flat) { - background-color: #f5f5f5; + background-color: #f5f5f5; } + .theme--dark.v-btn { - color: #fff; + color: #fff; } + .theme--dark.v-btn.v-btn--disabled { - color: rgba(255,255,255,0.3) !important; + color: rgba(255, 255, 255, 0.3) !important; } + .theme--dark.v-btn.v-btn--disabled .v-icon, .theme--dark.v-btn.v-btn--disabled .v-btn__loading { - color: rgba(255,255,255,0.3) !important; + color: rgba(255, 255, 255, 0.3) !important; } + .theme--dark.v-btn.v-btn--disabled:not(.v-btn--icon):not(.v-btn--flat) { - background-color: rgba(255,255,255,0.12) !important; + background-color: rgba(255, 255, 255, 0.12) !important; } + .theme--dark.v-btn:not(.v-btn--icon):not(.v-btn--flat) { - background-color: #212121; + background-color: #212121; } + /** Base Spec */ .v-btn { - align-items: center; - border-radius: 2px; - display: inline-flex; - height: 36px; - flex: 0 0 auto; - font-size: 14px; - font-weight: 500; - justify-content: center; - margin: 6px 8px; - min-width: 88px; - outline: 0; - text-transform: uppercase; - text-decoration: none; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1), color 1ms; - position: relative; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + align-items: center; + border-radius: 2px; + display: inline-flex; + height: 36px; + flex: 0 0 auto; + font-size: 14px; + font-weight: 500; + justify-content: center; + margin: 6px 8px; + min-width: 88px; + outline: 0; + text-transform: uppercase; + text-decoration: none; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1), color 1ms; + position: relative; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + /** Psuedo */ .v-btn:before { - border-radius: inherit; - color: inherit; - content: ''; - position: absolute; - left: 0; - top: 0; - height: 100%; - opacity: 0.12; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - width: 100%; + border-radius: inherit; + color: inherit; + content: ''; + position: absolute; + left: 0; + top: 0; + height: 100%; + opacity: 0.12; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + width: 100%; } + /** Content */ .v-btn { - padding: 0 16px; + padding: 0 16px; } + .v-btn--active, .v-btn:hover, .v-btn:focus { - position: relative; + position: relative; } + .v-btn--active:before, .v-btn:hover:before, .v-btn:focus:before { - background-color: currentColor; + background-color: currentColor; } + .v-btn__content { - align-items: center; - border-radius: inherit; - color: inherit; - display: flex; - flex: 1 0 auto; - justify-content: center; - margin: 0 auto; - position: relative; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - white-space: nowrap; - width: inherit; + align-items: center; + border-radius: inherit; + color: inherit; + display: flex; + flex: 1 0 auto; + justify-content: center; + margin: 0 auto; + position: relative; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + white-space: nowrap; + width: inherit; } + /** Sizes */ .v-btn--small { - font-size: 13px; - height: 28px; - padding: 0 8px; + font-size: 13px; + height: 28px; + padding: 0 8px; } + .v-btn--large { - font-size: 15px; - height: 44px; - padding: 0 32px; + font-size: 15px; + height: 44px; + padding: 0 32px; } + /** Icons */ .v-btn .v-btn__content .v-icon { - color: inherit; + color: inherit; } + /** Types */ .v-btn:not(.v-btn--depressed):not(.v-btn--flat) { - will-change: box-shadow; - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); + will-change: box-shadow; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } + .v-btn:not(.v-btn--depressed):not(.v-btn--flat):active { - box-shadow: 0px 5px 5px -3px rgba(0,0,0,0.2), 0px 8px 10px 1px rgba(0,0,0,0.14), 0px 3px 14px 2px rgba(0,0,0,0.12); + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); } + .v-btn--icon { - background: transparent; - box-shadow: none !important; - border-radius: 50%; - justify-content: center; - min-width: 0; - width: 36px; + background: transparent; + box-shadow: none !important; + border-radius: 50%; + justify-content: center; + min-width: 0; + width: 36px; } + .v-btn--icon.v-btn--small { - width: 28px; + width: 28px; } + .v-btn--icon.v-btn--large { - width: 44px; + width: 44px; } + .v-btn--icon:before { - border-radius: 50%; + border-radius: 50%; } + .v-btn--floating { - border-radius: 50%; - min-width: 0; - height: 56px; - width: 56px; - padding: 0; + border-radius: 50%; + min-width: 0; + height: 56px; + width: 56px; + padding: 0; } + .v-btn--floating.v-btn--fixed, .v-btn--floating.v-btn--absolute { - z-index: 4; + z-index: 4; } + .v-btn--floating:not(.v-btn--depressed):not(.v-btn--flat) { - box-shadow: 0px 3px 5px -1px rgba(0,0,0,0.2), 0px 6px 10px 0px rgba(0,0,0,0.14), 0px 1px 18px 0px rgba(0,0,0,0.12); + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); } + .v-btn--floating:not(.v-btn--depressed):not(.v-btn--flat):active { - box-shadow: 0px 7px 8px -4px rgba(0,0,0,0.2), 0px 12px 17px 2px rgba(0,0,0,0.14), 0px 5px 22px 4px rgba(0,0,0,0.12); + box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); } + .v-btn--floating .v-btn__content { - flex: 1 1 auto; - margin: 0; - height: 100%; + flex: 1 1 auto; + margin: 0; + height: 100%; } + .v-btn--floating:after { - border-radius: 50%; + border-radius: 50%; } + .v-btn--floating .v-btn__content :not(:only-child) { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-btn--floating .v-btn__content :not(:only-child):first-child { - opacity: 1; + opacity: 1; } + .v-btn--floating .v-btn__content :not(:only-child):last-child { - opacity: 0; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); + opacity: 0; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } + .v-btn--floating .v-btn__content :not(:only-child):last-child, .v-btn--floating .v-btn__content :not(:only-child):first-child { - -webkit-backface-visibility: hidden; - position: absolute; - left: 0; - top: 0; + -webkit-backface-visibility: hidden; + position: absolute; + left: 0; + top: 0; } + .v-btn--floating.v-btn--active .v-btn__content :not(:only-child):first-child { - opacity: 0; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); + opacity: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); } + .v-btn--floating.v-btn--active .v-btn__content :not(:only-child):last-child { - opacity: 1; - -webkit-transform: rotate(0); - transform: rotate(0); + opacity: 1; + -webkit-transform: rotate(0); + transform: rotate(0); } + .v-btn--floating .v-icon { - height: inherit; - width: inherit; + height: inherit; + width: inherit; } + .v-btn--floating.v-btn--small { - height: 40px; - width: 40px; + height: 40px; + width: 40px; } + .v-btn--floating.v-btn--small .v-icon { - font-size: 18px; + font-size: 18px; } + .v-btn--floating.v-btn--large { - height: 72px; - width: 72px; + height: 72px; + width: 72px; } + .v-btn--floating.v-btn--large .v-icon { - font-size: 30px; + font-size: 30px; } + .v-btn--reverse .v-btn__content { - flex-direction: row-reverse; + flex-direction: row-reverse; } + .v-btn--reverse.v-btn--column .v-btn__content { - flex-direction: column-reverse; + flex-direction: column-reverse; } + .v-btn--fixed, .v-btn--absolute { - margin: 0; + margin: 0; } + .v-btn.v-btn--absolute { - position: absolute; + position: absolute; } + .v-btn.v-btn--fixed { - position: fixed; + position: fixed; } + .v-btn--top:not(.v-btn--absolute) { - top: 16px; + top: 16px; } + .v-btn--top.v-btn--absolute { - top: -28px; + top: -28px; } + .v-btn--top.v-btn--absolute.v-btn--small { - top: -20px; + top: -20px; } + .v-btn--top.v-btn--absolute.v-btn--large { - top: -36px; + top: -36px; } + .v-btn--bottom:not(.v-btn--absolute) { - bottom: 16px; + bottom: 16px; } + .v-btn--bottom.v-btn--absolute { - bottom: -28px; + bottom: -28px; } + .v-btn--bottom.v-btn--absolute.v-btn--small { - bottom: -20px; + bottom: -20px; } + .v-btn--bottom.v-btn--absolute.v-btn--large { - bottom: -36px; + bottom: -36px; } + .v-btn--left { - left: 16px; + left: 16px; } + .v-btn--right { - right: 16px; + right: 16px; } + /** Disabled */ .v-btn.v-btn--disabled { - box-shadow: none !important; - pointer-events: none; + box-shadow: none !important; + pointer-events: none; } + .v-btn:not(.v-btn--disabled):not(.v-btn--floating):not(.v-btn--icon) .v-btn__content .v-icon { - transition: none; + transition: none; } + .v-btn--icon { - padding: 0; + padding: 0; } + /** Loader */ .v-btn--loader { - pointer-events: none; + pointer-events: none; } + .v-btn--loader .v-btn__content { - opacity: 0; + opacity: 0; } + .v-btn__loading { - align-items: center; - display: flex; - height: 100%; - justify-content: center; - left: 0; - position: absolute; - top: 0; - width: 100%; + align-items: center; + display: flex; + height: 100%; + justify-content: center; + left: 0; + position: absolute; + top: 0; + width: 100%; } + .v-btn__loading .v-icon--left { - margin-right: 1rem; - line-height: inherit; + margin-right: 1rem; + line-height: inherit; } + .v-btn__loading .v-icon--right { - margin-left: 1rem; - line-height: inherit; + margin-left: 1rem; + line-height: inherit; } + /** Custom Buttons */ .v-btn.v-btn--outline { - border: 1px solid currentColor; - background: transparent !important; - box-shadow: none; + border: 1px solid currentColor; + background: transparent !important; + box-shadow: none; } + .v-btn.v-btn--outline:hover { - box-shadow: none; + box-shadow: none; } + .v-btn--block { - display: flex; - flex: 1; - margin: 6px 0; - width: 100%; + display: flex; + flex: 1; + margin: 6px 0; + width: 100%; } + .v-btn--round { - border-radius: 28px; + border-radius: 28px; } + .v-btn--round:after { - border-radius: 28px; + border-radius: 28px; } + /** Button w/ directional Icon */ .v-btn .v-icon--right { - margin-left: 16px; + margin-left: 16px; } + .v-btn .v-icon--left { - margin-right: 16px; + margin-right: 16px; } + /** Themes */ .v-btn:not(.v-btn--outline).primary, .v-btn:not(.v-btn--outline).secondary, @@ -5871,493 +7199,591 @@ p { .v-btn:not(.v-btn--outline).error, .v-btn:not(.v-btn--outline).warning, .v-btn:not(.v-btn--outline).info { - color: #fff; + color: #fff; } .v-progress-circular { - position: relative; - display: inline-flex; - vertical-align: middle; + position: relative; + display: inline-flex; + vertical-align: middle; } + .v-progress-circular svg { - width: 100%; - height: 100%; - margin: auto; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 0; + width: 100%; + height: 100%; + margin: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 0; } + .v-progress-circular--indeterminate svg { - -webkit-animation: progress-circular-rotate 1.4s linear infinite; - animation: progress-circular-rotate 1.4s linear infinite; - -webkit-transform-origin: center center; - transform-origin: center center; - transition: all 0.2s ease-in-out; + -webkit-animation: progress-circular-rotate 1.4s linear infinite; + animation: progress-circular-rotate 1.4s linear infinite; + -webkit-transform-origin: center center; + transform-origin: center center; + transition: all 0.2s ease-in-out; } + .v-progress-circular--indeterminate .v-progress-circular__overlay { - -webkit-animation: progress-circular-dash 1.4s ease-in-out infinite; - animation: progress-circular-dash 1.4s ease-in-out infinite; - stroke-linecap: round; - stroke-dasharray: 80, 200; - stroke-dashoffset: 0px; + -webkit-animation: progress-circular-dash 1.4s ease-in-out infinite; + animation: progress-circular-dash 1.4s ease-in-out infinite; + stroke-linecap: round; + stroke-dasharray: 80, 200; + stroke-dashoffset: 0px; } + .v-progress-circular__underlay { - stroke: rgba(0,0,0,0.1); - z-index: 1; + stroke: rgba(0, 0, 0, 0.1); + z-index: 1; } + .v-progress-circular__overlay { - stroke: currentColor; - z-index: 2; - transition: all 0.6s ease-in-out; + stroke: currentColor; + z-index: 2; + transition: all 0.6s ease-in-out; } + .v-progress-circular__info { - position: absolute; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); } + @-webkit-keyframes progress-circular-dash { - 0% { - stroke-dasharray: 1, 200; - stroke-dashoffset: 0px; - } - 50% { - stroke-dasharray: 100, 200; - stroke-dashoffset: -15px; - } - 100% { - stroke-dasharray: 100, 200; - stroke-dashoffset: -125px; - } + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0px; + } + 50% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -15px; + } + 100% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -125px; + } } + @keyframes progress-circular-dash { - 0% { - stroke-dasharray: 1, 200; - stroke-dashoffset: 0px; - } - 50% { - stroke-dasharray: 100, 200; - stroke-dashoffset: -15px; - } - 100% { - stroke-dasharray: 100, 200; - stroke-dashoffset: -125px; - } + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0px; + } + 50% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -15px; + } + 100% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -125px; + } } + @-webkit-keyframes progress-circular-rotate { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } } + @keyframes progress-circular-rotate { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } } /** Themes */ .theme--light.v-btn-toggle { - background: #fff; + background: #fff; } + .theme--light.v-btn-toggle .v-btn { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-btn-toggle .v-btn.v-btn--active:not(:last-child):not([data-only-child]) { - border-right-color: rgba(0,0,0,0.26); + border-right-color: rgba(0, 0, 0, 0.26); } + .theme--dark.v-btn-toggle { - background: #424242; + background: #424242; } + .theme--dark.v-btn-toggle .v-btn { - color: #fff; + color: #fff; } + .theme--dark.v-btn-toggle .v-btn.v-btn--active:not(:last-child):not([data-only-child]) { - border-right-color: rgba(255,255,255,0.3); + border-right-color: rgba(255, 255, 255, 0.3); } + .v-btn-toggle { - display: inline-flex; - border-radius: 2px; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - will-change: background, box-shadow; + display: inline-flex; + border-radius: 2px; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + will-change: background, box-shadow; } + .v-btn-toggle .v-btn { - justify-content: center; - min-width: auto; - width: auto; - padding: 0 8px; - margin: 0; - opacity: 0.4; - border-radius: 0; + justify-content: center; + min-width: auto; + width: auto; + padding: 0 8px; + margin: 0; + opacity: 0.4; + border-radius: 0; } + .v-btn-toggle .v-btn:not(:last-child) { - border-right: 1px solid transparent; + border-right: 1px solid transparent; } + .v-btn-toggle .v-btn:after { - display: none; + display: none; } + .v-btn-toggle .v-btn.v-btn--active { - opacity: 1; + opacity: 1; } + .v-btn-toggle .v-btn span + .v-icon { - font-size: initial; - margin-left: 10px; + font-size: initial; + margin-left: 10px; } + .v-btn-toggle .v-btn:first-child { - border-radius: 2px 0 0 2px; + border-radius: 2px 0 0 2px; } + .v-btn-toggle .v-btn:last-child { - border-radius: 0 2px 2px 0; + border-radius: 0 2px 2px 0; } + .v-btn-toggle--selected { - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } .v-image { - z-index: 0; + z-index: 0; } + .v-image__image, .v-image__placeholder { - z-index: -1; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; + z-index: -1; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; } + .v-image__image { - background-repeat: no-repeat; + background-repeat: no-repeat; } + .v-image__image--preload { - -webkit-filter: blur(2px); - filter: blur(2px); + -webkit-filter: blur(2px); + filter: blur(2px); } + .v-image__image--contain { - background-size: contain; + background-size: contain; } + .v-image__image--cover { - background-size: cover; + background-size: cover; } .v-responsive { - position: relative; - overflow: hidden; - flex: 1 0 auto; - display: flex; + position: relative; + overflow: hidden; + flex: 1 0 auto; + display: flex; } + .v-responsive__content { - flex: 1 0 0px; + flex: 1 0 0px; } + .v-responsive__sizer { - transition: padding-bottom 0.2s cubic-bezier(0.25, 0.8, 0.5, 1); - flex: 0 0 0px; + transition: padding-bottom 0.2s cubic-bezier(0.25, 0.8, 0.5, 1); + flex: 0 0 0px; } .application--is-rtl .v-carousel__prev { - left: auto; - right: 5px; + left: auto; + right: 5px; } + .application--is-rtl .v-carousel__next { - left: 5px; - right: auto; + left: 5px; + right: auto; } + .v-carousel { - height: 500px; - width: 100%; - position: relative; - overflow: hidden; - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); + height: 500px; + width: 100%; + position: relative; + overflow: hidden; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } + .v-carousel__item { - position: absolute; - top: 0; - width: 100%; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + position: absolute; + top: 0; + width: 100%; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-carousel__prev, .v-carousel__next { - position: absolute; - top: 50%; - z-index: 1; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); + position: absolute; + top: 50%; + z-index: 1; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); } + .v-carousel__prev .v-btn, .v-carousel__next .v-btn { - margin: 0; - height: auto; - width: auto; + margin: 0; + height: auto; + width: auto; } + .v-carousel__prev .v-btn i, .v-carousel__next .v-btn i { - font-size: 48px; + font-size: 48px; } + .v-carousel__prev .v-btn:hover, .v-carousel__next .v-btn:hover { - background: none; + background: none; } + .v-carousel__prev { - left: 5px; + left: 5px; } + .v-carousel__next { - right: 5px; + right: 5px; } + .v-carousel__controls { - background: rgba(0,0,0,0.5); - align-items: center; - bottom: 0; - display: flex; - justify-content: center; - left: 0; - position: absolute; - height: 50px; - list-style-type: none; - width: 100%; - z-index: 1; + background: rgba(0, 0, 0, 0.5); + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + height: 50px; + list-style-type: none; + width: 100%; + z-index: 1; } + .v-carousel__controls__item { - margin: 0 8px !important; + margin: 0 8px !important; } + .v-carousel__controls__item .v-icon { - opacity: 0.5; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + opacity: 0.5; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-carousel__controls__item--active .v-icon { - opacity: 1; - vertical-align: middle; + opacity: 1; + vertical-align: middle; } + .v-carousel__controls__item:hover { - background: none; + background: none; } + .v-carousel__controls__item:hover .v-icon { - opacity: 0.8; + opacity: 0.8; } .theme--light.v-data-iterator .v-data-iterator__actions { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-data-iterator .v-data-iterator__actions__select .v-select .v-select__selection--comma { - color: rgba(0,0,0,0.54) !important; + color: rgba(0, 0, 0, 0.54) !important; } + .theme--light.v-data-iterator .v-data-iterator__actions__select .v-select .v-input__append-inner { - color: rgba(0,0,0,0.54) !important; + color: rgba(0, 0, 0, 0.54) !important; } + .theme--dark.v-data-iterator .v-data-iterator__actions { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-data-iterator .v-data-iterator__actions__select .v-select .v-select__selection--comma { - color: rgba(255,255,255,0.7) !important; + color: rgba(255, 255, 255, 0.7) !important; } + .theme--dark.v-data-iterator .v-data-iterator__actions__select .v-select .v-input__append-inner { - color: rgba(255,255,255,0.7) !important; + color: rgba(255, 255, 255, 0.7) !important; } + /** Actions */ .v-data-iterator__actions { - display: flex; - justify-content: flex-end; - align-items: center; - font-size: 12px; - flex-wrap: wrap-reverse; + display: flex; + justify-content: flex-end; + align-items: center; + font-size: 12px; + flex-wrap: wrap-reverse; } + .v-data-iterator__actions .v-btn { - color: inherit; + color: inherit; } + .v-data-iterator__actions .v-btn:last-of-type { - margin-left: 14px; + margin-left: 14px; } + .v-data-iterator__actions__range-controls { - display: flex; - align-items: center; - min-height: 48px; + display: flex; + align-items: center; + min-height: 48px; } + .v-data-iterator__actions__pagination { - display: block; - text-align: center; - margin: 0 32px 0 24px; + display: block; + text-align: center; + margin: 0 32px 0 24px; } + .v-data-iterator__actions__select { - display: flex; - align-items: center; - justify-content: center; - margin-right: 14px; + display: flex; + align-items: center; + justify-content: center; + margin-right: 14px; } + .v-data-iterator__actions__select .v-select { - margin: 13px 0 13px 34px; - padding: 0; - position: initial; + margin: 13px 0 13px 34px; + padding: 0; + position: initial; } + .v-data-iterator__actions__select .v-select .v-select__selection--comma { - font-size: 12px; + font-size: 12px; } .theme--light.v-overflow-btn .v-input__control::before, .theme--light.v-overflow-btn .v-input__slot::before { - background-color: rgba(0,0,0,0.12) !important; + background-color: rgba(0, 0, 0, 0.12) !important; } + .theme--light.v-overflow-btn--segmented .v-input__append-inner, .theme--light.v-overflow-btn--editable:hover .v-input__append-inner, .theme--light.v-overflow-btn--editable.v-input--is-focused .v-input__append-inner, .theme--light.v-overflow-btn--editable.v-select--is-menu-active .v-input__append-inner { - border-left: 1px solid rgba(0,0,0,0.12); + border-left: 1px solid rgba(0, 0, 0, 0.12); } + .theme--light.v-overflow-btn:hover .v-input__slot, .theme--light.v-overflow-btn.v-input--is-focused .v-input__slot, .theme--light.v-overflow-btn.v-select--is-menu-active .v-input__slot { - background: #fff; + background: #fff; } + .theme--dark.v-overflow-btn .v-input__control::before, .theme--dark.v-overflow-btn .v-input__slot::before { - background-color: rgba(255,255,255,0.12) !important; + background-color: rgba(255, 255, 255, 0.12) !important; } + .theme--dark.v-overflow-btn--segmented .v-input__append-inner, .theme--dark.v-overflow-btn--editable:hover .v-input__append-inner, .theme--dark.v-overflow-btn--editable.v-input--is-focused .v-input__append-inner, .theme--dark.v-overflow-btn--editable.v-select--is-menu-active .v-input__append-inner { - border-left: 1px solid rgba(255,255,255,0.12); + border-left: 1px solid rgba(255, 255, 255, 0.12); } + .theme--dark.v-overflow-btn:hover .v-input__slot, .theme--dark.v-overflow-btn.v-input--is-focused .v-input__slot, .theme--dark.v-overflow-btn.v-select--is-menu-active .v-input__slot { - background: #424242; + background: #424242; } + .v-overflow-btn { - margin-top: 12px; + margin-top: 12px; } + .v-overflow-btn:not(.v-overflow-btn--editable) > .v-input__control > .v-input__slot { - cursor: pointer; + cursor: pointer; } + .v-overflow-btn .v-select__slot { - height: 48px; + height: 48px; } + .v-overflow-btn .v-select__slot input { - margin-left: 16px; + margin-left: 16px; } + .v-overflow-btn .v-select__selection--comma:first-child { - margin-left: 16px; + margin-left: 16px; } + .v-overflow-btn .v-input__slot { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-overflow-btn .v-input__slot::after { - content: none; + content: none; } + .v-overflow-btn .v-label { - margin-left: 16px; - top: calc(50% - 10px); + margin-left: 16px; + top: calc(50% - 10px); } + .v-overflow-btn .v-input__append-inner { - width: 48px; - height: 48px; - align-self: auto; - align-items: center; - margin-top: 0; - padding: 0; - flex-shrink: 0; + width: 48px; + height: 48px; + align-self: auto; + align-items: center; + margin-top: 0; + padding: 0; + flex-shrink: 0; } + .v-overflow-btn .v-input__append-outer, .v-overflow-btn .v-input__prepend-outer { - margin-top: 12px; - margin-bottom: 12px; + margin-top: 12px; + margin-bottom: 12px; } + .v-overflow-btn .v-input__control::before { - height: 1px; - top: -1px; - content: ''; - left: 0; - position: absolute; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - width: 100%; + height: 1px; + top: -1px; + content: ''; + left: 0; + position: absolute; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + width: 100%; } + .v-overflow-btn.v-input--is-focused .v-input__slot, .v-overflow-btn.v-select--is-menu-active .v-input__slot { - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } + .v-overflow-btn .v-select__selections { - width: 0px; + width: 0px; } + .v-overflow-btn--segmented .v-select__selections { - flex-wrap: nowrap; + flex-wrap: nowrap; } + .v-overflow-btn--segmented .v-select__selections .v-btn { - border-radius: 0; - margin: 0; - margin-right: -16px; - height: 48px; - width: 100%; + border-radius: 0; + margin: 0; + margin-right: -16px; + height: 48px; + width: 100%; } + .v-overflow-btn--segmented .v-select__selections .v-btn__content { - justify-content: start; + justify-content: start; } + .v-overflow-btn--segmented .v-select__selections .v-btn__content::before { - background-color: transparent; + background-color: transparent; } + .v-overflow-btn--editable .v-input__append-inner, .v-overflow-btn--editable .v-input__append-inner * { - cursor: pointer; + cursor: pointer; } /* Theme */ .theme--light.v-table { - background-color: #fff; - color: rgba(0,0,0,0.87); + background-color: #fff; + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-table thead tr:first-child { - border-bottom: 1px solid rgba(0,0,0,0.12); + border-bottom: 1px solid rgba(0, 0, 0, 0.12); } + .theme--light.v-table thead th { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-table tbody tr:not(:last-child) { - border-bottom: 1px solid rgba(0,0,0,0.12); + border-bottom: 1px solid rgba(0, 0, 0, 0.12); } + .theme--light.v-table tbody tr[active] { - background: #f5f5f5; + background: #f5f5f5; } + .theme--light.v-table tbody tr:hover:not(.v-datatable__expand-row) { - background: #eee; + background: #eee; } + .theme--light.v-table tfoot tr { - border-top: 1px solid rgba(0,0,0,0.12); + border-top: 1px solid rgba(0, 0, 0, 0.12); } + .theme--dark.v-table { - background-color: #424242; - color: #fff; + background-color: #424242; + color: #fff; } + .theme--dark.v-table thead tr:first-child { - border-bottom: 1px solid rgba(255,255,255,0.12); + border-bottom: 1px solid rgba(255, 255, 255, 0.12); } + .theme--dark.v-table thead th { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-table tbody tr:not(:last-child) { - border-bottom: 1px solid rgba(255,255,255,0.12); + border-bottom: 1px solid rgba(255, 255, 255, 0.12); } + .theme--dark.v-table tbody tr[active] { - background: #505050; + background: #505050; } + .theme--dark.v-table tbody tr:hover:not(.v-datatable__expand-row) { - background: #616161; + background: #616161; } + .theme--dark.v-table tfoot tr { - border-top: 1px solid rgba(255,255,255,0.12); + border-top: 1px solid rgba(255, 255, 255, 0.12); } + .v-table__overflow { - width: 100%; - overflow-x: auto; - overflow-y: hidden; + width: 100%; + overflow-x: auto; + overflow-y: hidden; } + table.v-table { - border-radius: 2px; - border-collapse: collapse; - border-spacing: 0; - width: 100%; - max-width: 100%; + border-radius: 2px; + border-collapse: collapse; + border-spacing: 0; + width: 100%; + max-width: 100%; } + table.v-table thead td:not(:nth-child(1)), table.v-table tbody td:not(:nth-child(1)), table.v-table thead th:not(:nth-child(1)), @@ -6366,3462 +7792,4238 @@ table.v-table thead td:first-child, table.v-table tbody td:first-child, table.v-table thead th:first-child, table.v-table tbody th:first-child { - padding: 0 24px; + padding: 0 24px; } + table.v-table thead tr { - height: 56px; + height: 56px; } + table.v-table thead th { - font-weight: 500; - font-size: 12px; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - white-space: nowrap; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + font-weight: 500; + font-size: 12px; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + table.v-table thead th.sortable { - pointer-events: auto; + pointer-events: auto; } + table.v-table thead th > div { - width: 100%; + width: 100%; } + table.v-table tbody tr { - transition: background 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - will-change: background; + transition: background 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + will-change: background; } + table.v-table tbody td, table.v-table tbody th { - height: 48px; + height: 48px; } + table.v-table tbody td { - font-weight: 400; - font-size: 13px; + font-weight: 400; + font-size: 13px; } + table.v-table .input-group--selection-controls { - padding: 0; + padding: 0; } + table.v-table .input-group--selection-controls .input-group__details { - display: none; + display: none; } + table.v-table .input-group--selection-controls.checkbox .v-icon { - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); } + table.v-table .input-group--selection-controls.checkbox .input-group--selection-controls__ripple { - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); } + table.v-table tfoot tr { - height: 48px; + height: 48px; } + table.v-table tfoot tr td { - padding: 0 24px; + padding: 0 24px; } /* Theme */ .theme--light.v-datatable thead th.column.sortable i { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-datatable thead th.column.sortable:hover { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-datatable thead th.column.sortable.active { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-datatable thead th.column.sortable.active i { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-datatable .v-datatable__actions { - background-color: #fff; - color: rgba(0,0,0,0.54); - border-top: 1px solid rgba(0,0,0,0.12); + background-color: #fff; + color: rgba(0, 0, 0, 0.54); + border-top: 1px solid rgba(0, 0, 0, 0.12); } + .theme--dark.v-datatable thead th.column.sortable i { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-datatable thead th.column.sortable:hover { - color: #fff; + color: #fff; } + .theme--dark.v-datatable thead th.column.sortable.active { - color: #fff; + color: #fff; } + .theme--dark.v-datatable thead th.column.sortable.active i { - color: #fff; + color: #fff; } + .theme--dark.v-datatable .v-datatable__actions { - background-color: #424242; - color: rgba(255,255,255,0.7); - border-top: 1px solid rgba(255,255,255,0.12); + background-color: #424242; + color: rgba(255, 255, 255, 0.7); + border-top: 1px solid rgba(255, 255, 255, 0.12); } + .v-datatable .v-input--selection-controls { - margin: 0; + margin: 0; } + .v-datatable thead th.column.sortable { - cursor: pointer; - outline: 0; + cursor: pointer; + outline: 0; } + .v-datatable thead th.column.sortable i { - font-size: 16px; - display: inline-block; - opacity: 0; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + font-size: 16px; + display: inline-block; + opacity: 0; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-datatable thead th.column.sortable:focus i, .v-datatable thead th.column.sortable:hover i { - opacity: 0.6; + opacity: 0.6; } + .v-datatable thead th.column.sortable.active { - -webkit-transform: none; - transform: none; + -webkit-transform: none; + transform: none; } + .v-datatable thead th.column.sortable.active i { - opacity: 1; + opacity: 1; } + .v-datatable thead th.column.sortable.active.desc i { - -webkit-transform: rotate(-180deg); - transform: rotate(-180deg); + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); } + /** Actions */ .v-datatable__actions { - display: flex; - justify-content: flex-end; - align-items: center; - font-size: 12px; - flex-wrap: wrap-reverse; + display: flex; + justify-content: flex-end; + align-items: center; + font-size: 12px; + flex-wrap: wrap-reverse; } + .v-datatable__actions .v-btn { - color: inherit; + color: inherit; } + .v-datatable__actions .v-btn:last-of-type { - margin-left: 14px; + margin-left: 14px; } + .v-datatable__actions__range-controls { - display: flex; - align-items: center; - min-height: 48px; + display: flex; + align-items: center; + min-height: 48px; } + .v-datatable__actions__pagination { - display: block; - text-align: center; - margin: 0 32px 0 24px; + display: block; + text-align: center; + margin: 0 32px 0 24px; } + .v-datatable__actions__select { - display: flex; - align-items: center; - justify-content: flex-end; - margin-right: 14px; - white-space: nowrap; + display: flex; + align-items: center; + justify-content: flex-end; + margin-right: 14px; + white-space: nowrap; } + .v-datatable__actions__select .v-select { - flex: 0 1 0; - margin: 13px 0 13px 34px; - padding: 0; - position: initial; + flex: 0 1 0; + margin: 13px 0 13px 34px; + padding: 0; + position: initial; } + .v-datatable__actions__select .v-select__selections { - flex-wrap: nowrap; + flex-wrap: nowrap; } + .v-datatable__actions__select .v-select__selections .v-select__selection--comma { - font-size: 12px; + font-size: 12px; } + .v-datatable__progress { - height: auto !important; + height: auto !important; } + .v-datatable__progress tr, .v-datatable__progress td, .v-datatable__progress th { - height: auto !important; + height: auto !important; } + .v-datatable__progress th { - padding: 0 !important; + padding: 0 !important; } + .v-datatable__progress th .v-progress-linear { - margin: 0; + margin: 0; } + .v-datatable__expand-row { - border: none !important; + border: none !important; } + .v-datatable__expand-col { - padding: 0 !important; - height: 0px !important; + padding: 0 !important; + height: 0px !important; } + .v-datatable__expand-col--expanded { - border-bottom: 1px solid rgba(0,0,0,0.12); + border-bottom: 1px solid rgba(0, 0, 0, 0.12); } + .v-datatable__expand-content { - transition: height 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: height 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-datatable__expand-content > .card { - border-radius: 0; - box-shadow: none; + border-radius: 0; + box-shadow: none; } .theme--light.v-small-dialog a { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--dark.v-small-dialog a { - color: #fff; + color: #fff; } + .theme--light.v-small-dialog__content { - background: #fff; + background: #fff; } + .theme--dark.v-small-dialog__content { - background: #424242; + background: #424242; } + .theme--light.v-small-dialog__actions { - background: #fff; + background: #fff; } + .theme--dark.v-small-dialog__actions { - background: #424242; + background: #424242; } + .v-small-dialog { - display: block; - width: 100%; - height: 100%; + display: block; + width: 100%; + height: 100%; } + .v-small-dialog__content { - padding: 0 24px; + padding: 0 24px; } + .v-small-dialog__actions { - text-align: right; - white-space: pre; + text-align: right; + white-space: pre; } + .v-small-dialog a { - display: flex; - align-items: center; - height: 100%; - text-decoration: none; + display: flex; + align-items: center; + height: 100%; + text-decoration: none; } + .v-small-dialog a > * { - width: 100%; + width: 100%; } + .v-small-dialog .v-menu__activator { - height: 100%; + height: 100%; } .application--is-rtl .v-date-picker-title .v-picker__title__btn { - text-align: right; + text-align: right; } + .v-date-picker-title { - display: flex; - justify-content: space-between; - flex-direction: column; - flex-wrap: wrap; - line-height: 1; + display: flex; + justify-content: space-between; + flex-direction: column; + flex-wrap: wrap; + line-height: 1; } + .v-date-picker-title__year { - align-items: center; - display: inline-flex; - font-size: 14px; - font-weight: 500; - margin-bottom: 8px; + align-items: center; + display: inline-flex; + font-size: 14px; + font-weight: 500; + margin-bottom: 8px; } + .v-date-picker-title__date { - font-size: 34px; - text-align: left; - font-weight: 500; - position: relative; - overflow: hidden; - padding-bottom: 8px; - margin-bottom: -8px; + font-size: 34px; + text-align: left; + font-weight: 500; + position: relative; + overflow: hidden; + padding-bottom: 8px; + margin-bottom: -8px; } + .v-date-picker-title__date > div { - position: relative; + position: relative; } .theme--light.v-date-picker-header .v-date-picker-header__value:not(.v-date-picker-header__value--disabled) strong:not(:hover) { - color: rgba(0,0,0,0.87) !important; + color: rgba(0, 0, 0, 0.87) !important; } + .theme--light.v-date-picker-header .v-date-picker-header__value--disabled strong { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--dark.v-date-picker-header .v-date-picker-header__value:not(.v-date-picker-header__value--disabled) strong:not(:hover) { - color: #fff !important; + color: #fff !important; } + .theme--dark.v-date-picker-header .v-date-picker-header__value--disabled strong { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .v-date-picker-header { - padding: 4px 16px; - align-items: center; - display: flex; - justify-content: space-between; - position: relative; + padding: 4px 16px; + align-items: center; + display: flex; + justify-content: space-between; + position: relative; } + .v-date-picker-header .v-btn { - margin: 0; - z-index: auto; + margin: 0; + z-index: auto; } + .v-date-picker-header .v-icon { - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-date-picker-header__value { - flex: 1; - text-align: center; - position: relative; - overflow: hidden; + flex: 1; + text-align: center; + position: relative; + overflow: hidden; } + .v-date-picker-header__value strong { - cursor: pointer; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - display: block; - width: 100%; + cursor: pointer; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + display: block; + width: 100%; } .theme--light.v-date-picker-table th { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--dark.v-date-picker-table th { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .v-date-picker-table { - position: relative; - padding: 0 12px; - height: 242px; + position: relative; + padding: 0 12px; + height: 242px; } + .v-date-picker-table table { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - top: 0; - table-layout: fixed; - width: 100%; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + top: 0; + table-layout: fixed; + width: 100%; } + .v-date-picker-table td, .v-date-picker-table th { - text-align: center; - position: relative; + text-align: center; + position: relative; } + .v-date-picker-table th { - font-size: 12px; + font-size: 12px; } + .v-date-picker-table--date .v-btn { - height: 32px; - width: 32px; + height: 32px; + width: 32px; } + .v-date-picker-table .v-btn { - z-index: auto; - margin: 0; - font-size: 12px; + z-index: auto; + margin: 0; + font-size: 12px; } + .v-date-picker-table .v-btn.v-btn--active { - color: #fff; + color: #fff; } + .v-date-picker-table--month td { - width: 33.333333%; - height: 56px; - vertical-align: middle; - text-align: center; + width: 33.333333%; + height: 56px; + vertical-align: middle; + text-align: center; } + .v-date-picker-table--month td .v-btn { - margin: 0 auto; - max-width: 160px; - min-width: 40px; - width: 100%; + margin: 0 auto; + max-width: 160px; + min-width: 40px; + width: 100%; } + .v-date-picker-table--date th { - padding: 8px 0; - font-weight: 600; + padding: 8px 0; + font-weight: 600; } + .v-date-picker-table--date td { - width: 45px; + width: 45px; } + .v-date-picker-table__event { - border-radius: 50%; - bottom: 2px; - content: ""; - display: block; - height: 8px; - left: 50%; - position: absolute; - -webkit-transform: translateX(-4px); - transform: translateX(-4px); - width: 8px; + border-radius: 50%; + bottom: 2px; + content: ""; + display: block; + height: 8px; + left: 50%; + position: absolute; + -webkit-transform: translateX(-4px); + transform: translateX(-4px); + width: 8px; } .v-date-picker-years { - font-size: 16px; - font-weight: 400; - height: 286px; - list-style-type: none; - overflow: auto; - padding: 0; - text-align: center; + font-size: 16px; + font-weight: 400; + height: 286px; + list-style-type: none; + overflow: auto; + padding: 0; + text-align: center; } + .v-date-picker-years li { - cursor: pointer; - padding: 8px 0; - transition: none; + cursor: pointer; + padding: 8px 0; + transition: none; } + .v-date-picker-years li.active { - font-size: 26px; - font-weight: 500; - padding: 10px 0; + font-size: 26px; + font-weight: 500; + padding: 10px 0; } + .v-date-picker-years li:hover { - background: rgba(0,0,0,0.12); + background: rgba(0, 0, 0, 0.12); } + .v-picker--landscape .v-date-picker-years { - height: 286px; + height: 286px; } /* Themes */ .theme--light.v-picker__title { - background: #e0e0e0; + background: #e0e0e0; } + .theme--dark.v-picker__title { - background: #616161; + background: #616161; } + .theme--light.v-picker__body { - background: #fff; + background: #fff; } + .theme--dark.v-picker__body { - background: #424242; + background: #424242; } + .v-picker { - border-radius: 2px; - contain: layout style; - display: inline-flex; - flex-direction: column; - vertical-align: top; + border-radius: 2px; + contain: layout style; + display: inline-flex; + flex-direction: column; + vertical-align: top; } + .v-picker--full-width { - display: flex; + display: flex; } + .v-picker__title { - color: #fff; - border-top-left-radius: 2px; - border-top-right-radius: 2px; - padding: 16px; + color: #fff; + border-top-left-radius: 2px; + border-top-right-radius: 2px; + padding: 16px; } + .v-picker__title__btn { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-picker__title__btn:not(.active) { - opacity: 0.6; - cursor: pointer; + opacity: 0.6; + cursor: pointer; } + .v-picker__title__btn:not(.active):hover { - opacity: 1; + opacity: 1; } + .v-picker__title__btn--readonly { - pointer-events: none; + pointer-events: none; } + .v-picker__title__btn--active { - opacity: 1; + opacity: 1; } + .v-picker__body { - height: auto; - overflow: hidden; - position: relative; - z-index: 0; - flex: 1 0 auto; - display: flex; - flex-direction: column; - align-items: center; + height: auto; + overflow: hidden; + position: relative; + z-index: 0; + flex: 1 0 auto; + display: flex; + flex-direction: column; + align-items: center; } + .v-picker__body > div { - width: 100%; + width: 100%; } + .v-picker__body > div.fade-transition-leave-active { - position: absolute; + position: absolute; } + .v-picker--landscape .v-picker__title { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - width: 170px; - position: absolute; - top: 0; - left: 0; - height: 100%; - z-index: 1; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + width: 170px; + position: absolute; + top: 0; + left: 0; + height: 100%; + z-index: 1; } + .v-picker--landscape .v-picker__body, .v-picker--landscape .v-picker__actions { - margin-left: 170px; + margin-left: 170px; } /** Theme */ .theme--light.v-expansion-panel .v-expansion-panel__container { - border-top: 1px solid rgba(0,0,0,0.12); - background-color: #fff; - color: rgba(0,0,0,0.87); + border-top: 1px solid rgba(0, 0, 0, 0.12); + background-color: #fff; + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-expansion-panel .v-expansion-panel__container .v-expansion-panel__header .v-expansion-panel__header__icon .v-icon { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-expansion-panel .v-expansion-panel__container--disabled { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-expansion-panel--focusable .v-expansion-panel__container:focus { - background-color: #eee; + background-color: #eee; } + .theme--dark.v-expansion-panel .v-expansion-panel__container { - border-top: 1px solid rgba(255,255,255,0.12); - background-color: #424242; - color: #fff; + border-top: 1px solid rgba(255, 255, 255, 0.12); + background-color: #424242; + color: #fff; } + .theme--dark.v-expansion-panel .v-expansion-panel__container .v-expansion-panel__header .v-expansion-panel__header__icon .v-icon { - color: #fff; + color: #fff; } + .theme--dark.v-expansion-panel .v-expansion-panel__container--disabled { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-expansion-panel--focusable .v-expansion-panel__container:focus { - background-color: #494949; + background-color: #494949; } + .v-expansion-panel { - display: flex; - flex-wrap: wrap; - justify-content: center; - list-style-type: none; - padding: 0; - text-align: left; - width: 100%; - box-shadow: 0px 2px 1px -1px rgba(0,0,0,0.2), 0px 1px 1px 0px rgba(0,0,0,0.14), 0px 1px 3px 0px rgba(0,0,0,0.12); + display: flex; + flex-wrap: wrap; + justify-content: center; + list-style-type: none; + padding: 0; + text-align: left; + width: 100%; + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); } + .v-expansion-panel__container { - flex: 1 0 100%; - max-width: 100%; - outline: none; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + flex: 1 0 100%; + max-width: 100%; + outline: none; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-expansion-panel__container:first-child { - border-top: none !important; + border-top: none !important; } + .v-expansion-panel__container .v-expansion-panel__header__iconnel__header__icon { - margin-left: auto; + margin-left: auto; } + .v-expansion-panel__container--disabled .v-expansion-panel__header { - pointer-events: none; + pointer-events: none; } + .v-expansion-panel__container--active > .v-expansion-panel__header .v-expansion-panel__header__icon .v-icon { - -webkit-transform: rotate(-180deg); - transform: rotate(-180deg); + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); } + .v-expansion-panel__header { - display: flex; - cursor: pointer; - align-items: center; - position: relative; - padding: 12px 24px; - min-height: 48px; + display: flex; + cursor: pointer; + align-items: center; + position: relative; + padding: 12px 24px; + min-height: 48px; } + .v-expansion-panel__header > *:not(.v-expansion-panel__header__icon) { - flex: 1 1 auto; + flex: 1 1 auto; } + .v-expansion-panel__body { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-expansion-panel__body .v-card { - border-radius: 0; - box-shadow: 0px 0px 0px 0px rgba(0,0,0,0.2), 0px 0px 0px 0px rgba(0,0,0,0.14), 0px 0px 0px 0px rgba(0,0,0,0.12); + border-radius: 0; + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); } + .v-expansion-panel--popout, .v-expansion-panel--inset { - box-shadow: 0px 0px 0px 0px rgba(0,0,0,0.2), 0px 0px 0px 0px rgba(0,0,0,0.14), 0px 0px 0px 0px rgba(0,0,0,0.12); + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); } + .v-expansion-panel--popout .v-expansion-panel__container--active, .v-expansion-panel--inset .v-expansion-panel__container--active { - margin: 16px; - box-shadow: 0px 3px 3px -2px rgba(0,0,0,0.2), 0px 3px 4px 0px rgba(0,0,0,0.14), 0px 1px 8px 0px rgba(0,0,0,0.12); + margin: 16px; + box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); } + .v-expansion-panel--popout .v-expansion-panel__container, .v-expansion-panel--inset .v-expansion-panel__container { - max-width: 95%; + max-width: 95%; } + .v-expansion-panel--popout .v-expansion-panel__container--active { - max-width: 100%; + max-width: 100%; } + .v-expansion-panel--inset .v-expansion-panel__container--active { - max-width: 85%; + max-width: 85%; } .theme--light.v-footer { - background: #f5f5f5; - color: rgba(0,0,0,0.87); + background: #f5f5f5; + color: rgba(0, 0, 0, 0.87); } + .theme--dark.v-footer { - background: #212121; - color: #fff; + background: #212121; + color: #fff; } + .v-footer { - align-items: center; - display: flex; - flex: 0 1 auto !important; - min-height: 36px; - transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + align-items: center; + display: flex; + flex: 0 1 auto !important; + min-height: 36px; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); } + .v-footer--absolute, .v-footer--fixed { - bottom: 0; - left: 0; - width: 100%; - z-index: 3; + bottom: 0; + left: 0; + width: 100%; + z-index: 3; } + .v-footer--inset { - z-index: 2; + z-index: 2; } + .v-footer--absolute { - position: absolute; + position: absolute; } + .v-footer--fixed { - position: fixed; + position: fixed; } .v-form > .container { - padding: 16px; + padding: 16px; } + .v-form > .container > .layout > .flex { - padding: 8px; + padding: 8px; } + .v-form > .container > .layout:only-child { - margin: -8px; + margin: -8px; } + .v-form > .container > .layout:not(:only-child) { - margin: auto -8px; + margin: auto -8px; } .container { - flex: 1 1 100%; - margin: auto; - padding: 24px; - width: 100%; + flex: 1 1 100%; + margin: auto; + padding: 24px; + width: 100%; } + .container.fluid { - max-width: 100%; + max-width: 100%; } + .container.fill-height { - align-items: center; - display: flex; + align-items: center; + display: flex; } + .container.fill-height > .layout { - height: 100%; - flex: 1 1 auto; + height: 100%; + flex: 1 1 auto; } + .container.grid-list-xs .layout .flex { - padding: 1px; + padding: 1px; } + .container.grid-list-xs .layout:only-child { - margin: -1px; + margin: -1px; } + .container.grid-list-xs .layout:not(:only-child) { - margin: auto -1px; + margin: auto -1px; } + .container.grid-list-xs *:not(:only-child) .layout:first-child { - margin-top: -1px; + margin-top: -1px; } + .container.grid-list-xs *:not(:only-child) .layout:last-child { - margin-bottom: -1px; + margin-bottom: -1px; } + .container.grid-list-sm .layout .flex { - padding: 2px; + padding: 2px; } + .container.grid-list-sm .layout:only-child { - margin: -2px; + margin: -2px; } + .container.grid-list-sm .layout:not(:only-child) { - margin: auto -2px; + margin: auto -2px; } + .container.grid-list-sm *:not(:only-child) .layout:first-child { - margin-top: -2px; + margin-top: -2px; } + .container.grid-list-sm *:not(:only-child) .layout:last-child { - margin-bottom: -2px; + margin-bottom: -2px; } + .container.grid-list-md .layout .flex { - padding: 4px; + padding: 4px; } + .container.grid-list-md .layout:only-child { - margin: -4px; + margin: -4px; } + .container.grid-list-md .layout:not(:only-child) { - margin: auto -4px; + margin: auto -4px; } + .container.grid-list-md *:not(:only-child) .layout:first-child { - margin-top: -4px; + margin-top: -4px; } + .container.grid-list-md *:not(:only-child) .layout:last-child { - margin-bottom: -4px; + margin-bottom: -4px; } + .container.grid-list-lg .layout .flex { - padding: 8px; + padding: 8px; } + .container.grid-list-lg .layout:only-child { - margin: -8px; + margin: -8px; } + .container.grid-list-lg .layout:not(:only-child) { - margin: auto -8px; + margin: auto -8px; } + .container.grid-list-lg *:not(:only-child) .layout:first-child { - margin-top: -8px; + margin-top: -8px; } + .container.grid-list-lg *:not(:only-child) .layout:last-child { - margin-bottom: -8px; + margin-bottom: -8px; } + .container.grid-list-xl .layout .flex { - padding: 12px; + padding: 12px; } + .container.grid-list-xl .layout:only-child { - margin: -12px; + margin: -12px; } + .container.grid-list-xl .layout:not(:only-child) { - margin: auto -12px; + margin: auto -12px; } + .container.grid-list-xl *:not(:only-child) .layout:first-child { - margin-top: -12px; + margin-top: -12px; } + .container.grid-list-xl *:not(:only-child) .layout:last-child { - margin-bottom: -12px; + margin-bottom: -12px; } + .layout { - display: flex; - flex: 1 1 auto; - flex-wrap: nowrap; - min-width: 0; + display: flex; + flex: 1 1 auto; + flex-wrap: nowrap; + min-width: 0; } + .layout.row { - flex-direction: row; + flex-direction: row; } + .layout.row.reverse { - flex-direction: row-reverse; + flex-direction: row-reverse; } + .layout.column { - flex-direction: column; + flex-direction: column; } + .layout.column.reverse { - flex-direction: column-reverse; + flex-direction: column-reverse; } + .layout.column > .flex { - max-width: 100%; + max-width: 100%; } + .layout.wrap { - flex-wrap: wrap; + flex-wrap: wrap; } + .flex, .child-flex > * { - flex: 1 1 auto; - max-width: 100%; + flex: 1 1 auto; + max-width: 100%; } + .align-start { - align-items: flex-start; + align-items: flex-start; } + .align-end { - align-items: flex-end; + align-items: flex-end; } + .align-center { - align-items: center; + align-items: center; } + .align-baseline { - align-items: baseline; + align-items: baseline; } + .align-self-start { - align-self: flex-start; + align-self: flex-start; } + .align-self-end { - align-self: flex-end; + align-self: flex-end; } + .align-self-center { - align-self: center; + align-self: center; } + .align-self-baseline { - align-self: baseline; + align-self: baseline; } + .align-content-start { - align-content: flex-start; + align-content: flex-start; } + .align-content-end { - align-content: flex-end; + align-content: flex-end; } + .align-content-center { - align-content: center; + align-content: center; } + .align-content-space-between { - align-content: space-between; + align-content: space-between; } + .align-content-space-around { - align-content: space-around; + align-content: space-around; } + .justify-start { - justify-content: flex-start; + justify-content: flex-start; } + .justify-end { - justify-content: flex-end; + justify-content: flex-end; } + .justify-center { - justify-content: center; + justify-content: center; } + .justify-space-around { - justify-content: space-around; + justify-content: space-around; } + .justify-space-between { - justify-content: space-between; + justify-content: space-between; } + .justify-self-start { - justify-self: flex-start; + justify-self: flex-start; } + .justify-self-end { - justify-self: flex-end; + justify-self: flex-end; } + .justify-self-center { - justify-self: center; + justify-self: center; } + .justify-self-baseline { - justify-self: baseline; + justify-self: baseline; } + .spacer { - flex-grow: 1 !important; + flex-grow: 1 !important; } + .grow { - flex-grow: 1 !important; - flex-shrink: 0 !important; + flex-grow: 1 !important; + flex-shrink: 0 !important; } + .shrink { - flex-grow: 0 !important; - flex-shrink: 1 !important; + flex-grow: 0 !important; + flex-shrink: 1 !important; } + .scroll-y { - overflow-y: auto; + overflow-y: auto; } + .fill-height { - height: 100%; + height: 100%; } + .hide-overflow { - overflow: hidden !important; + overflow: hidden !important; } + .show-overflow { - overflow: visible !important; + overflow: visible !important; } + .no-wrap { - white-space: nowrap; + white-space: nowrap; } + .ellipsis { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + .d-flex { - display: flex !important; + display: flex !important; } + .d-inline-flex { - display: inline-flex !important; + display: inline-flex !important; } + .d-flex > *, .d-inline-flex > * { - flex: 1 1 auto !important; + flex: 1 1 auto !important; } + .d-block { - display: block !important; + display: block !important; } + .d-inline-block { - display: inline-block !important; + display: inline-block !important; } + .d-inline { - display: inline !important; + display: inline !important; } + @media only screen and (min-width: 960px) { - .container { - max-width: 900px; - } + .container { + max-width: 900px; + } } + @media only screen and (min-width: 1264px) { - .container { - max-width: 1185px; - } + .container { + max-width: 1185px; + } } + @media only screen and (min-width: 1904px) { - .container { - max-width: 1785px; - } + .container { + max-width: 1785px; + } } + @media only screen and (max-width: 959px) { - .container { - padding: 16px; - } + .container { + padding: 16px; + } } + @media all and (min-width: 0) { - .flex.xs1 { - flex-basis: 8.333333333333332%; - flex-grow: 0; - max-width: 8.333333333333332%; - } - .flex.order-xs1 { - order: 1; - } - .flex.xs2 { - flex-basis: 16.666666666666664%; - flex-grow: 0; - max-width: 16.666666666666664%; - } - .flex.order-xs2 { - order: 2; - } - .flex.xs3 { - flex-basis: 25%; - flex-grow: 0; - max-width: 25%; - } - .flex.order-xs3 { - order: 3; - } - .flex.xs4 { - flex-basis: 33.33333333333333%; - flex-grow: 0; - max-width: 33.33333333333333%; - } - .flex.order-xs4 { - order: 4; - } - .flex.xs5 { - flex-basis: 41.66666666666667%; - flex-grow: 0; - max-width: 41.66666666666667%; - } - .flex.order-xs5 { - order: 5; - } - .flex.xs6 { - flex-basis: 50%; - flex-grow: 0; - max-width: 50%; - } - .flex.order-xs6 { - order: 6; - } - .flex.xs7 { - flex-basis: 58.333333333333336%; - flex-grow: 0; - max-width: 58.333333333333336%; - } - .flex.order-xs7 { - order: 7; - } - .flex.xs8 { - flex-basis: 66.66666666666666%; - flex-grow: 0; - max-width: 66.66666666666666%; - } - .flex.order-xs8 { - order: 8; - } - .flex.xs9 { - flex-basis: 75%; - flex-grow: 0; - max-width: 75%; - } - .flex.order-xs9 { - order: 9; - } - .flex.xs10 { - flex-basis: 83.33333333333334%; - flex-grow: 0; - max-width: 83.33333333333334%; - } - .flex.order-xs10 { - order: 10; - } - .flex.xs11 { - flex-basis: 91.66666666666666%; - flex-grow: 0; - max-width: 91.66666666666666%; - } - .flex.order-xs11 { - order: 11; - } - .flex.xs12 { - flex-basis: 100%; - flex-grow: 0; - max-width: 100%; - } - .flex.order-xs12 { - order: 12; - } - .flex.offset-xs0 { - margin-left: 0%; - } - .flex.offset-xs1 { - margin-left: 8.333333333333332%; - } - .flex.offset-xs2 { - margin-left: 16.666666666666664%; - } - .flex.offset-xs3 { - margin-left: 25%; - } - .flex.offset-xs4 { - margin-left: 33.33333333333333%; - } - .flex.offset-xs5 { - margin-left: 41.66666666666667%; - } - .flex.offset-xs6 { - margin-left: 50%; - } - .flex.offset-xs7 { - margin-left: 58.333333333333336%; - } - .flex.offset-xs8 { - margin-left: 66.66666666666666%; - } - .flex.offset-xs9 { - margin-left: 75%; - } - .flex.offset-xs10 { - margin-left: 83.33333333333334%; - } - .flex.offset-xs11 { - margin-left: 91.66666666666666%; - } - .flex.offset-xs12 { - margin-left: 100%; - } + .flex.xs1 { + flex-basis: 8.333333333333332%; + flex-grow: 0; + max-width: 8.333333333333332%; + } + + .flex.order-xs1 { + order: 1; + } + + .flex.xs2 { + flex-basis: 16.666666666666664%; + flex-grow: 0; + max-width: 16.666666666666664%; + } + + .flex.order-xs2 { + order: 2; + } + + .flex.xs3 { + flex-basis: 25%; + flex-grow: 0; + max-width: 25%; + } + + .flex.order-xs3 { + order: 3; + } + + .flex.xs4 { + flex-basis: 33.33333333333333%; + flex-grow: 0; + max-width: 33.33333333333333%; + } + + .flex.order-xs4 { + order: 4; + } + + .flex.xs5 { + flex-basis: 41.66666666666667%; + flex-grow: 0; + max-width: 41.66666666666667%; + } + + .flex.order-xs5 { + order: 5; + } + + .flex.xs6 { + flex-basis: 50%; + flex-grow: 0; + max-width: 50%; + } + + .flex.order-xs6 { + order: 6; + } + + .flex.xs7 { + flex-basis: 58.333333333333336%; + flex-grow: 0; + max-width: 58.333333333333336%; + } + + .flex.order-xs7 { + order: 7; + } + + .flex.xs8 { + flex-basis: 66.66666666666666%; + flex-grow: 0; + max-width: 66.66666666666666%; + } + + .flex.order-xs8 { + order: 8; + } + + .flex.xs9 { + flex-basis: 75%; + flex-grow: 0; + max-width: 75%; + } + + .flex.order-xs9 { + order: 9; + } + + .flex.xs10 { + flex-basis: 83.33333333333334%; + flex-grow: 0; + max-width: 83.33333333333334%; + } + + .flex.order-xs10 { + order: 10; + } + + .flex.xs11 { + flex-basis: 91.66666666666666%; + flex-grow: 0; + max-width: 91.66666666666666%; + } + + .flex.order-xs11 { + order: 11; + } + + .flex.xs12 { + flex-basis: 100%; + flex-grow: 0; + max-width: 100%; + } + + .flex.order-xs12 { + order: 12; + } + + .flex.offset-xs0 { + margin-left: 0%; + } + + .flex.offset-xs1 { + margin-left: 8.333333333333332%; + } + + .flex.offset-xs2 { + margin-left: 16.666666666666664%; + } + + .flex.offset-xs3 { + margin-left: 25%; + } + + .flex.offset-xs4 { + margin-left: 33.33333333333333%; + } + + .flex.offset-xs5 { + margin-left: 41.66666666666667%; + } + + .flex.offset-xs6 { + margin-left: 50%; + } + + .flex.offset-xs7 { + margin-left: 58.333333333333336%; + } + + .flex.offset-xs8 { + margin-left: 66.66666666666666%; + } + + .flex.offset-xs9 { + margin-left: 75%; + } + + .flex.offset-xs10 { + margin-left: 83.33333333333334%; + } + + .flex.offset-xs11 { + margin-left: 91.66666666666666%; + } + + .flex.offset-xs12 { + margin-left: 100%; + } } + @media all and (min-width: 600px) { - .flex.sm1 { - flex-basis: 8.333333333333332%; - flex-grow: 0; - max-width: 8.333333333333332%; - } - .flex.order-sm1 { - order: 1; - } - .flex.sm2 { - flex-basis: 16.666666666666664%; - flex-grow: 0; - max-width: 16.666666666666664%; - } - .flex.order-sm2 { - order: 2; - } - .flex.sm3 { - flex-basis: 25%; - flex-grow: 0; - max-width: 25%; - } - .flex.order-sm3 { - order: 3; - } - .flex.sm4 { - flex-basis: 33.33333333333333%; - flex-grow: 0; - max-width: 33.33333333333333%; - } - .flex.order-sm4 { - order: 4; - } - .flex.sm5 { - flex-basis: 41.66666666666667%; - flex-grow: 0; - max-width: 41.66666666666667%; - } - .flex.order-sm5 { - order: 5; - } - .flex.sm6 { - flex-basis: 50%; - flex-grow: 0; - max-width: 50%; - } - .flex.order-sm6 { - order: 6; - } - .flex.sm7 { - flex-basis: 58.333333333333336%; - flex-grow: 0; - max-width: 58.333333333333336%; - } - .flex.order-sm7 { - order: 7; - } - .flex.sm8 { - flex-basis: 66.66666666666666%; - flex-grow: 0; - max-width: 66.66666666666666%; - } - .flex.order-sm8 { - order: 8; - } - .flex.sm9 { - flex-basis: 75%; - flex-grow: 0; - max-width: 75%; - } - .flex.order-sm9 { - order: 9; - } - .flex.sm10 { - flex-basis: 83.33333333333334%; - flex-grow: 0; - max-width: 83.33333333333334%; - } - .flex.order-sm10 { - order: 10; - } - .flex.sm11 { - flex-basis: 91.66666666666666%; - flex-grow: 0; - max-width: 91.66666666666666%; - } - .flex.order-sm11 { - order: 11; - } - .flex.sm12 { - flex-basis: 100%; - flex-grow: 0; - max-width: 100%; - } - .flex.order-sm12 { - order: 12; - } - .flex.offset-sm0 { - margin-left: 0%; - } - .flex.offset-sm1 { - margin-left: 8.333333333333332%; - } - .flex.offset-sm2 { - margin-left: 16.666666666666664%; - } - .flex.offset-sm3 { - margin-left: 25%; - } - .flex.offset-sm4 { - margin-left: 33.33333333333333%; - } - .flex.offset-sm5 { - margin-left: 41.66666666666667%; - } - .flex.offset-sm6 { - margin-left: 50%; - } - .flex.offset-sm7 { - margin-left: 58.333333333333336%; - } - .flex.offset-sm8 { - margin-left: 66.66666666666666%; - } - .flex.offset-sm9 { - margin-left: 75%; - } - .flex.offset-sm10 { - margin-left: 83.33333333333334%; - } - .flex.offset-sm11 { - margin-left: 91.66666666666666%; - } - .flex.offset-sm12 { - margin-left: 100%; - } + .flex.sm1 { + flex-basis: 8.333333333333332%; + flex-grow: 0; + max-width: 8.333333333333332%; + } + + .flex.order-sm1 { + order: 1; + } + + .flex.sm2 { + flex-basis: 16.666666666666664%; + flex-grow: 0; + max-width: 16.666666666666664%; + } + + .flex.order-sm2 { + order: 2; + } + + .flex.sm3 { + flex-basis: 25%; + flex-grow: 0; + max-width: 25%; + } + + .flex.order-sm3 { + order: 3; + } + + .flex.sm4 { + flex-basis: 33.33333333333333%; + flex-grow: 0; + max-width: 33.33333333333333%; + } + + .flex.order-sm4 { + order: 4; + } + + .flex.sm5 { + flex-basis: 41.66666666666667%; + flex-grow: 0; + max-width: 41.66666666666667%; + } + + .flex.order-sm5 { + order: 5; + } + + .flex.sm6 { + flex-basis: 50%; + flex-grow: 0; + max-width: 50%; + } + + .flex.order-sm6 { + order: 6; + } + + .flex.sm7 { + flex-basis: 58.333333333333336%; + flex-grow: 0; + max-width: 58.333333333333336%; + } + + .flex.order-sm7 { + order: 7; + } + + .flex.sm8 { + flex-basis: 66.66666666666666%; + flex-grow: 0; + max-width: 66.66666666666666%; + } + + .flex.order-sm8 { + order: 8; + } + + .flex.sm9 { + flex-basis: 75%; + flex-grow: 0; + max-width: 75%; + } + + .flex.order-sm9 { + order: 9; + } + + .flex.sm10 { + flex-basis: 83.33333333333334%; + flex-grow: 0; + max-width: 83.33333333333334%; + } + + .flex.order-sm10 { + order: 10; + } + + .flex.sm11 { + flex-basis: 91.66666666666666%; + flex-grow: 0; + max-width: 91.66666666666666%; + } + + .flex.order-sm11 { + order: 11; + } + + .flex.sm12 { + flex-basis: 100%; + flex-grow: 0; + max-width: 100%; + } + + .flex.order-sm12 { + order: 12; + } + + .flex.offset-sm0 { + margin-left: 0%; + } + + .flex.offset-sm1 { + margin-left: 8.333333333333332%; + } + + .flex.offset-sm2 { + margin-left: 16.666666666666664%; + } + + .flex.offset-sm3 { + margin-left: 25%; + } + + .flex.offset-sm4 { + margin-left: 33.33333333333333%; + } + + .flex.offset-sm5 { + margin-left: 41.66666666666667%; + } + + .flex.offset-sm6 { + margin-left: 50%; + } + + .flex.offset-sm7 { + margin-left: 58.333333333333336%; + } + + .flex.offset-sm8 { + margin-left: 66.66666666666666%; + } + + .flex.offset-sm9 { + margin-left: 75%; + } + + .flex.offset-sm10 { + margin-left: 83.33333333333334%; + } + + .flex.offset-sm11 { + margin-left: 91.66666666666666%; + } + + .flex.offset-sm12 { + margin-left: 100%; + } } + @media all and (min-width: 960px) { - .flex.md1 { - flex-basis: 8.333333333333332%; - flex-grow: 0; - max-width: 8.333333333333332%; - } - .flex.order-md1 { - order: 1; - } - .flex.md2 { - flex-basis: 16.666666666666664%; - flex-grow: 0; - max-width: 16.666666666666664%; - } - .flex.order-md2 { - order: 2; - } - .flex.md3 { - flex-basis: 25%; - flex-grow: 0; - max-width: 25%; - } - .flex.order-md3 { - order: 3; - } - .flex.md4 { - flex-basis: 33.33333333333333%; - flex-grow: 0; - max-width: 33.33333333333333%; - } - .flex.order-md4 { - order: 4; - } - .flex.md5 { - flex-basis: 41.66666666666667%; - flex-grow: 0; - max-width: 41.66666666666667%; - } - .flex.order-md5 { - order: 5; - } - .flex.md6 { - flex-basis: 50%; - flex-grow: 0; - max-width: 50%; - } - .flex.order-md6 { - order: 6; - } - .flex.md7 { - flex-basis: 58.333333333333336%; - flex-grow: 0; - max-width: 58.333333333333336%; - } - .flex.order-md7 { - order: 7; - } - .flex.md8 { - flex-basis: 66.66666666666666%; - flex-grow: 0; - max-width: 66.66666666666666%; - } - .flex.order-md8 { - order: 8; - } - .flex.md9 { - flex-basis: 75%; - flex-grow: 0; - max-width: 75%; - } - .flex.order-md9 { - order: 9; - } - .flex.md10 { - flex-basis: 83.33333333333334%; - flex-grow: 0; - max-width: 83.33333333333334%; - } - .flex.order-md10 { - order: 10; - } - .flex.md11 { - flex-basis: 91.66666666666666%; - flex-grow: 0; - max-width: 91.66666666666666%; - } - .flex.order-md11 { - order: 11; - } - .flex.md12 { - flex-basis: 100%; - flex-grow: 0; - max-width: 100%; - } - .flex.order-md12 { - order: 12; - } - .flex.offset-md0 { - margin-left: 0%; - } - .flex.offset-md1 { - margin-left: 8.333333333333332%; - } - .flex.offset-md2 { - margin-left: 16.666666666666664%; - } - .flex.offset-md3 { - margin-left: 25%; - } - .flex.offset-md4 { - margin-left: 33.33333333333333%; - } - .flex.offset-md5 { - margin-left: 41.66666666666667%; - } - .flex.offset-md6 { - margin-left: 50%; - } - .flex.offset-md7 { - margin-left: 58.333333333333336%; - } - .flex.offset-md8 { - margin-left: 66.66666666666666%; - } - .flex.offset-md9 { - margin-left: 75%; - } - .flex.offset-md10 { - margin-left: 83.33333333333334%; - } - .flex.offset-md11 { - margin-left: 91.66666666666666%; - } - .flex.offset-md12 { - margin-left: 100%; - } + .flex.md1 { + flex-basis: 8.333333333333332%; + flex-grow: 0; + max-width: 8.333333333333332%; + } + + .flex.order-md1 { + order: 1; + } + + .flex.md2 { + flex-basis: 16.666666666666664%; + flex-grow: 0; + max-width: 16.666666666666664%; + } + + .flex.order-md2 { + order: 2; + } + + .flex.md3 { + flex-basis: 25%; + flex-grow: 0; + max-width: 25%; + } + + .flex.order-md3 { + order: 3; + } + + .flex.md4 { + flex-basis: 33.33333333333333%; + flex-grow: 0; + max-width: 33.33333333333333%; + } + + .flex.order-md4 { + order: 4; + } + + .flex.md5 { + flex-basis: 41.66666666666667%; + flex-grow: 0; + max-width: 41.66666666666667%; + } + + .flex.order-md5 { + order: 5; + } + + .flex.md6 { + flex-basis: 50%; + flex-grow: 0; + max-width: 50%; + } + + .flex.order-md6 { + order: 6; + } + + .flex.md7 { + flex-basis: 58.333333333333336%; + flex-grow: 0; + max-width: 58.333333333333336%; + } + + .flex.order-md7 { + order: 7; + } + + .flex.md8 { + flex-basis: 66.66666666666666%; + flex-grow: 0; + max-width: 66.66666666666666%; + } + + .flex.order-md8 { + order: 8; + } + + .flex.md9 { + flex-basis: 75%; + flex-grow: 0; + max-width: 75%; + } + + .flex.order-md9 { + order: 9; + } + + .flex.md10 { + flex-basis: 83.33333333333334%; + flex-grow: 0; + max-width: 83.33333333333334%; + } + + .flex.order-md10 { + order: 10; + } + + .flex.md11 { + flex-basis: 91.66666666666666%; + flex-grow: 0; + max-width: 91.66666666666666%; + } + + .flex.order-md11 { + order: 11; + } + + .flex.md12 { + flex-basis: 100%; + flex-grow: 0; + max-width: 100%; + } + + .flex.order-md12 { + order: 12; + } + + .flex.offset-md0 { + margin-left: 0%; + } + + .flex.offset-md1 { + margin-left: 8.333333333333332%; + } + + .flex.offset-md2 { + margin-left: 16.666666666666664%; + } + + .flex.offset-md3 { + margin-left: 25%; + } + + .flex.offset-md4 { + margin-left: 33.33333333333333%; + } + + .flex.offset-md5 { + margin-left: 41.66666666666667%; + } + + .flex.offset-md6 { + margin-left: 50%; + } + + .flex.offset-md7 { + margin-left: 58.333333333333336%; + } + + .flex.offset-md8 { + margin-left: 66.66666666666666%; + } + + .flex.offset-md9 { + margin-left: 75%; + } + + .flex.offset-md10 { + margin-left: 83.33333333333334%; + } + + .flex.offset-md11 { + margin-left: 91.66666666666666%; + } + + .flex.offset-md12 { + margin-left: 100%; + } } + @media all and (min-width: 1264px) { - .flex.lg1 { - flex-basis: 8.333333333333332%; - flex-grow: 0; - max-width: 8.333333333333332%; - } - .flex.order-lg1 { - order: 1; - } - .flex.lg2 { - flex-basis: 16.666666666666664%; - flex-grow: 0; - max-width: 16.666666666666664%; - } - .flex.order-lg2 { - order: 2; - } - .flex.lg3 { - flex-basis: 25%; - flex-grow: 0; - max-width: 25%; - } - .flex.order-lg3 { - order: 3; - } - .flex.lg4 { - flex-basis: 33.33333333333333%; - flex-grow: 0; - max-width: 33.33333333333333%; - } - .flex.order-lg4 { - order: 4; - } - .flex.lg5 { - flex-basis: 41.66666666666667%; - flex-grow: 0; - max-width: 41.66666666666667%; - } - .flex.order-lg5 { - order: 5; - } - .flex.lg6 { - flex-basis: 50%; - flex-grow: 0; - max-width: 50%; - } - .flex.order-lg6 { - order: 6; - } - .flex.lg7 { - flex-basis: 58.333333333333336%; - flex-grow: 0; - max-width: 58.333333333333336%; - } - .flex.order-lg7 { - order: 7; - } - .flex.lg8 { - flex-basis: 66.66666666666666%; - flex-grow: 0; - max-width: 66.66666666666666%; - } - .flex.order-lg8 { - order: 8; - } - .flex.lg9 { - flex-basis: 75%; - flex-grow: 0; - max-width: 75%; - } - .flex.order-lg9 { - order: 9; - } - .flex.lg10 { - flex-basis: 83.33333333333334%; - flex-grow: 0; - max-width: 83.33333333333334%; - } - .flex.order-lg10 { - order: 10; - } - .flex.lg11 { - flex-basis: 91.66666666666666%; - flex-grow: 0; - max-width: 91.66666666666666%; - } - .flex.order-lg11 { - order: 11; - } - .flex.lg12 { - flex-basis: 100%; - flex-grow: 0; - max-width: 100%; - } - .flex.order-lg12 { - order: 12; - } - .flex.offset-lg0 { - margin-left: 0%; - } - .flex.offset-lg1 { - margin-left: 8.333333333333332%; - } - .flex.offset-lg2 { - margin-left: 16.666666666666664%; - } - .flex.offset-lg3 { - margin-left: 25%; - } - .flex.offset-lg4 { - margin-left: 33.33333333333333%; - } - .flex.offset-lg5 { - margin-left: 41.66666666666667%; - } - .flex.offset-lg6 { - margin-left: 50%; - } - .flex.offset-lg7 { - margin-left: 58.333333333333336%; - } - .flex.offset-lg8 { - margin-left: 66.66666666666666%; - } - .flex.offset-lg9 { - margin-left: 75%; - } - .flex.offset-lg10 { - margin-left: 83.33333333333334%; - } - .flex.offset-lg11 { - margin-left: 91.66666666666666%; - } - .flex.offset-lg12 { - margin-left: 100%; - } + .flex.lg1 { + flex-basis: 8.333333333333332%; + flex-grow: 0; + max-width: 8.333333333333332%; + } + + .flex.order-lg1 { + order: 1; + } + + .flex.lg2 { + flex-basis: 16.666666666666664%; + flex-grow: 0; + max-width: 16.666666666666664%; + } + + .flex.order-lg2 { + order: 2; + } + + .flex.lg3 { + flex-basis: 25%; + flex-grow: 0; + max-width: 25%; + } + + .flex.order-lg3 { + order: 3; + } + + .flex.lg4 { + flex-basis: 33.33333333333333%; + flex-grow: 0; + max-width: 33.33333333333333%; + } + + .flex.order-lg4 { + order: 4; + } + + .flex.lg5 { + flex-basis: 41.66666666666667%; + flex-grow: 0; + max-width: 41.66666666666667%; + } + + .flex.order-lg5 { + order: 5; + } + + .flex.lg6 { + flex-basis: 50%; + flex-grow: 0; + max-width: 50%; + } + + .flex.order-lg6 { + order: 6; + } + + .flex.lg7 { + flex-basis: 58.333333333333336%; + flex-grow: 0; + max-width: 58.333333333333336%; + } + + .flex.order-lg7 { + order: 7; + } + + .flex.lg8 { + flex-basis: 66.66666666666666%; + flex-grow: 0; + max-width: 66.66666666666666%; + } + + .flex.order-lg8 { + order: 8; + } + + .flex.lg9 { + flex-basis: 75%; + flex-grow: 0; + max-width: 75%; + } + + .flex.order-lg9 { + order: 9; + } + + .flex.lg10 { + flex-basis: 83.33333333333334%; + flex-grow: 0; + max-width: 83.33333333333334%; + } + + .flex.order-lg10 { + order: 10; + } + + .flex.lg11 { + flex-basis: 91.66666666666666%; + flex-grow: 0; + max-width: 91.66666666666666%; + } + + .flex.order-lg11 { + order: 11; + } + + .flex.lg12 { + flex-basis: 100%; + flex-grow: 0; + max-width: 100%; + } + + .flex.order-lg12 { + order: 12; + } + + .flex.offset-lg0 { + margin-left: 0%; + } + + .flex.offset-lg1 { + margin-left: 8.333333333333332%; + } + + .flex.offset-lg2 { + margin-left: 16.666666666666664%; + } + + .flex.offset-lg3 { + margin-left: 25%; + } + + .flex.offset-lg4 { + margin-left: 33.33333333333333%; + } + + .flex.offset-lg5 { + margin-left: 41.66666666666667%; + } + + .flex.offset-lg6 { + margin-left: 50%; + } + + .flex.offset-lg7 { + margin-left: 58.333333333333336%; + } + + .flex.offset-lg8 { + margin-left: 66.66666666666666%; + } + + .flex.offset-lg9 { + margin-left: 75%; + } + + .flex.offset-lg10 { + margin-left: 83.33333333333334%; + } + + .flex.offset-lg11 { + margin-left: 91.66666666666666%; + } + + .flex.offset-lg12 { + margin-left: 100%; + } } + @media all and (min-width: 1904px) { - .flex.xl1 { - flex-basis: 8.333333333333332%; - flex-grow: 0; - max-width: 8.333333333333332%; - } - .flex.order-xl1 { - order: 1; - } - .flex.xl2 { - flex-basis: 16.666666666666664%; - flex-grow: 0; - max-width: 16.666666666666664%; - } - .flex.order-xl2 { - order: 2; - } - .flex.xl3 { - flex-basis: 25%; - flex-grow: 0; - max-width: 25%; - } - .flex.order-xl3 { - order: 3; - } - .flex.xl4 { - flex-basis: 33.33333333333333%; - flex-grow: 0; - max-width: 33.33333333333333%; - } - .flex.order-xl4 { - order: 4; - } - .flex.xl5 { - flex-basis: 41.66666666666667%; - flex-grow: 0; - max-width: 41.66666666666667%; - } - .flex.order-xl5 { - order: 5; - } - .flex.xl6 { - flex-basis: 50%; - flex-grow: 0; - max-width: 50%; - } - .flex.order-xl6 { - order: 6; - } - .flex.xl7 { - flex-basis: 58.333333333333336%; - flex-grow: 0; - max-width: 58.333333333333336%; - } - .flex.order-xl7 { - order: 7; - } - .flex.xl8 { - flex-basis: 66.66666666666666%; - flex-grow: 0; - max-width: 66.66666666666666%; - } - .flex.order-xl8 { - order: 8; - } - .flex.xl9 { - flex-basis: 75%; - flex-grow: 0; - max-width: 75%; - } - .flex.order-xl9 { - order: 9; - } - .flex.xl10 { - flex-basis: 83.33333333333334%; - flex-grow: 0; - max-width: 83.33333333333334%; - } - .flex.order-xl10 { - order: 10; - } - .flex.xl11 { - flex-basis: 91.66666666666666%; - flex-grow: 0; - max-width: 91.66666666666666%; - } - .flex.order-xl11 { - order: 11; - } - .flex.xl12 { - flex-basis: 100%; - flex-grow: 0; - max-width: 100%; - } - .flex.order-xl12 { - order: 12; - } - .flex.offset-xl0 { - margin-left: 0%; - } - .flex.offset-xl1 { - margin-left: 8.333333333333332%; - } - .flex.offset-xl2 { - margin-left: 16.666666666666664%; - } - .flex.offset-xl3 { - margin-left: 25%; - } - .flex.offset-xl4 { - margin-left: 33.33333333333333%; - } - .flex.offset-xl5 { - margin-left: 41.66666666666667%; - } - .flex.offset-xl6 { - margin-left: 50%; - } - .flex.offset-xl7 { - margin-left: 58.333333333333336%; - } - .flex.offset-xl8 { - margin-left: 66.66666666666666%; - } - .flex.offset-xl9 { - margin-left: 75%; - } - .flex.offset-xl10 { - margin-left: 83.33333333333334%; - } - .flex.offset-xl11 { - margin-left: 91.66666666666666%; - } - .flex.offset-xl12 { - margin-left: 100%; - } + .flex.xl1 { + flex-basis: 8.333333333333332%; + flex-grow: 0; + max-width: 8.333333333333332%; + } + + .flex.order-xl1 { + order: 1; + } + + .flex.xl2 { + flex-basis: 16.666666666666664%; + flex-grow: 0; + max-width: 16.666666666666664%; + } + + .flex.order-xl2 { + order: 2; + } + + .flex.xl3 { + flex-basis: 25%; + flex-grow: 0; + max-width: 25%; + } + + .flex.order-xl3 { + order: 3; + } + + .flex.xl4 { + flex-basis: 33.33333333333333%; + flex-grow: 0; + max-width: 33.33333333333333%; + } + + .flex.order-xl4 { + order: 4; + } + + .flex.xl5 { + flex-basis: 41.66666666666667%; + flex-grow: 0; + max-width: 41.66666666666667%; + } + + .flex.order-xl5 { + order: 5; + } + + .flex.xl6 { + flex-basis: 50%; + flex-grow: 0; + max-width: 50%; + } + + .flex.order-xl6 { + order: 6; + } + + .flex.xl7 { + flex-basis: 58.333333333333336%; + flex-grow: 0; + max-width: 58.333333333333336%; + } + + .flex.order-xl7 { + order: 7; + } + + .flex.xl8 { + flex-basis: 66.66666666666666%; + flex-grow: 0; + max-width: 66.66666666666666%; + } + + .flex.order-xl8 { + order: 8; + } + + .flex.xl9 { + flex-basis: 75%; + flex-grow: 0; + max-width: 75%; + } + + .flex.order-xl9 { + order: 9; + } + + .flex.xl10 { + flex-basis: 83.33333333333334%; + flex-grow: 0; + max-width: 83.33333333333334%; + } + + .flex.order-xl10 { + order: 10; + } + + .flex.xl11 { + flex-basis: 91.66666666666666%; + flex-grow: 0; + max-width: 91.66666666666666%; + } + + .flex.order-xl11 { + order: 11; + } + + .flex.xl12 { + flex-basis: 100%; + flex-grow: 0; + max-width: 100%; + } + + .flex.order-xl12 { + order: 12; + } + + .flex.offset-xl0 { + margin-left: 0%; + } + + .flex.offset-xl1 { + margin-left: 8.333333333333332%; + } + + .flex.offset-xl2 { + margin-left: 16.666666666666664%; + } + + .flex.offset-xl3 { + margin-left: 25%; + } + + .flex.offset-xl4 { + margin-left: 33.33333333333333%; + } + + .flex.offset-xl5 { + margin-left: 41.66666666666667%; + } + + .flex.offset-xl6 { + margin-left: 50%; + } + + .flex.offset-xl7 { + margin-left: 58.333333333333336%; + } + + .flex.offset-xl8 { + margin-left: 66.66666666666666%; + } + + .flex.offset-xl9 { + margin-left: 75%; + } + + .flex.offset-xl10 { + margin-left: 83.33333333333334%; + } + + .flex.offset-xl11 { + margin-left: 91.66666666666666%; + } + + .flex.offset-xl12 { + margin-left: 100%; + } } .v-content { - transition: none; - display: flex; - flex: 1 0 auto; - max-width: 100%; + transition: none; + display: flex; + flex: 1 0 auto; + max-width: 100%; } + .v-content[data-booted="true"] { - transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); } + .v-content__wrap { - flex: 1 1 auto; - max-width: 100%; - position: relative; + flex: 1 1 auto; + max-width: 100%; + position: relative; } + @-moz-document url-prefix() { } + @media print { - @-moz-document url-prefix() { - .v-content { - display: block; + @-moz-document url-prefix() { + .v-content { + display: block; + } } - } } .theme--light.v-jumbotron .v-jumbotron__content { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--dark.v-jumbotron .v-jumbotron__content { - color: #fff; + color: #fff; } + .v-jumbotron { - display: block; - top: 0; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - width: 100%; + display: block; + top: 0; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + width: 100%; } + .v-jumbotron__wrapper { - height: 100%; - overflow: hidden; - position: relative; - transition: inherit; - width: 100%; + height: 100%; + overflow: hidden; + position: relative; + transition: inherit; + width: 100%; } + .v-jumbotron__background { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - contain: strict; - transition: inherit; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + contain: strict; + transition: inherit; } + .v-jumbotron__image { - position: absolute; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - min-width: 100%; - will-change: transform; - transition: inherit; + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + min-width: 100%; + will-change: transform; + transition: inherit; } + .v-jumbotron__content { - height: 100%; - position: relative; - transition: inherit; + height: 100%; + position: relative; + transition: inherit; } .theme--light.v-navigation-drawer { - background-color: #fff; + background-color: #fff; } + .theme--light.v-navigation-drawer:not(.v-navigation-drawer--floating) .v-navigation-drawer__border { - background-color: rgba(0,0,0,0.12); + background-color: rgba(0, 0, 0, 0.12); } + .theme--light.v-navigation-drawer .v-divider { - border-color: rgba(0,0,0,0.12); + border-color: rgba(0, 0, 0, 0.12); } + .theme--dark.v-navigation-drawer { - background-color: #424242; + background-color: #424242; } + .theme--dark.v-navigation-drawer:not(.v-navigation-drawer--floating) .v-navigation-drawer__border { - background-color: rgba(255,255,255,0.12); + background-color: rgba(255, 255, 255, 0.12); } + .theme--dark.v-navigation-drawer .v-divider { - border-color: rgba(255,255,255,0.12); + border-color: rgba(255, 255, 255, 0.12); } + .v-navigation-drawer { - transition: none; - display: block; - left: 0; - max-width: 100%; - overflow-y: auto; - overflow-x: hidden; - pointer-events: auto; - top: 0; - will-change: transform; - z-index: 3; - -webkit-overflow-scrolling: touch; + transition: none; + display: block; + left: 0; + max-width: 100%; + overflow-y: auto; + overflow-x: hidden; + pointer-events: auto; + top: 0; + will-change: transform; + z-index: 3; + -webkit-overflow-scrolling: touch; } + .v-navigation-drawer[data-booted="true"] { - transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); } + .v-navigation-drawer[data-booted="true"] { - transition-property: width, -webkit-transform; - transition-property: transform, width; - transition-property: transform, width, -webkit-transform; + transition-property: width, -webkit-transform; + transition-property: transform, width; + transition-property: transform, width, -webkit-transform; } + .v-navigation-drawer__border { - position: absolute; - right: 0; - top: 0; - height: 100%; - width: 1px; + position: absolute; + right: 0; + top: 0; + height: 100%; + width: 1px; } + .v-navigation-drawer.v-navigation-drawer--right:after { - left: 0; - right: initial; + left: 0; + right: initial; } + .v-navigation-drawer--right { - left: auto; - right: 0; + left: auto; + right: 0; } + .v-navigation-drawer--right > .v-navigation-drawer__border { - right: auto; - left: 0; + right: auto; + left: 0; } + .v-navigation-drawer--absolute { - position: absolute; + position: absolute; } + .v-navigation-drawer--fixed { - position: fixed; + position: fixed; } + .v-navigation-drawer--floating:after { - display: none; + display: none; } + .v-navigation-drawer--mini-variant { - overflow: hidden; + overflow: hidden; } + .v-navigation-drawer--mini-variant .v-list__group__header__prepend-icon { - flex: 1 0 auto; - justify-content: center; - width: 100%; + flex: 1 0 auto; + justify-content: center; + width: 100%; } + .v-navigation-drawer--mini-variant .v-list__tile__action, .v-navigation-drawer--mini-variant .v-list__tile__avatar { - justify-content: center; - min-width: 48px; + justify-content: center; + min-width: 48px; } + .v-navigation-drawer--mini-variant .v-list__tile__content, .v-navigation-drawer--mini-variant .v-list__tile:after { - opacity: 0; + opacity: 0; } + .v-navigation-drawer--mini-variant .v-subheader, .v-navigation-drawer--mini-variant .v-divider, .v-navigation-drawer--mini-variant .v-list--group { - display: none !important; + display: none !important; } + .v-navigation-drawer--temporary, .v-navigation-drawer--is-mobile { - z-index: 6; + z-index: 6; } + .v-navigation-drawer--temporary:not(.v-navigation-drawer--close), .v-navigation-drawer--is-mobile:not(.v-navigation-drawer--close) { - box-shadow: 0px 8px 10px -5px rgba(0,0,0,0.2), 0px 16px 24px 2px rgba(0,0,0,0.14), 0px 6px 30px 5px rgba(0,0,0,0.12); + box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); } + .v-navigation-drawer .v-list { - background: inherit; + background: inherit; } + .v-navigation-drawer > .v-list .v-list__tile { - transition: none; - font-weight: 500; + transition: none; + font-weight: 500; } + .v-navigation-drawer > .v-list .v-list__tile--active .v-list__tile__title { - color: inherit; + color: inherit; } + .v-navigation-drawer > .v-list .v-list--group .v-list__tile { - font-weight: 400; + font-weight: 400; } + .v-navigation-drawer > .v-list .v-list--group__header--active:after { - background: transparent; + background: transparent; } + .v-navigation-drawer > .v-list:not(.v-list--dense) .v-list__tile { - font-size: 14px; + font-size: 14px; } .theme--light.v-pagination .v-pagination__item { - background: #fff; - color: #000; - width: auto; - min-width: 34px; - padding: 0 5px; + background: #fff; + color: #000; + width: auto; + min-width: 34px; + padding: 0 5px; } + .theme--light.v-pagination .v-pagination__item--active { - color: #fff; + color: #fff; } + .theme--light.v-pagination .v-pagination__navigation { - background: #fff; + background: #fff; } + .theme--light.v-pagination .v-pagination__navigation .v-icon { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--dark.v-pagination .v-pagination__item { - background: #424242; - color: #fff; - width: auto; - min-width: 34px; - padding: 0 5px; + background: #424242; + color: #fff; + width: auto; + min-width: 34px; + padding: 0 5px; } + .theme--dark.v-pagination .v-pagination__item--active { - color: #fff; + color: #fff; } + .theme--dark.v-pagination .v-pagination__navigation { - background: #424242; + background: #424242; } + .theme--dark.v-pagination .v-pagination__navigation .v-icon { - color: #fff; + color: #fff; } + .v-pagination { - align-items: center; - display: inline-flex; - list-style-type: none; - margin: 0; - max-width: 100%; - padding: 0; + align-items: center; + display: inline-flex; + list-style-type: none; + margin: 0; + max-width: 100%; + padding: 0; } + .v-pagination > li { - align-items: center; - display: flex; + align-items: center; + display: flex; } + .v-pagination--circle .v-pagination__item, .v-pagination--circle .v-pagination__more, .v-pagination--circle .v-pagination__navigation { - border-radius: 50%; + border-radius: 50%; } + .v-pagination--disabled { - pointer-events: none; - opacity: 0.6; + pointer-events: none; + opacity: 0.6; } + .v-pagination__item { - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); - border-radius: 4px; - display: inline-flex; - justify-content: center; - align-items: center; - font-size: 14px; - background: transparent; - height: 34px; - width: 34px; - margin: 0.3rem; - text-decoration: none; - transition: 0.3s cubic-bezier(0, 0, 0.2, 1); + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + border-radius: 4px; + display: inline-flex; + justify-content: center; + align-items: center; + font-size: 14px; + background: transparent; + height: 34px; + width: 34px; + margin: 0.3rem; + text-decoration: none; + transition: 0.3s cubic-bezier(0, 0, 0.2, 1); } + .v-pagination__item--active { - box-shadow: 0px 2px 4px -1px rgba(0,0,0,0.2), 0px 4px 5px 0px rgba(0,0,0,0.14), 0px 1px 10px 0px rgba(0,0,0,0.12); + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); } + .v-pagination__navigation { - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); - display: inline-flex; - justify-content: center; - align-items: center; - text-decoration: none; - height: 2rem; - border-radius: 4px; - width: 2rem; - margin: 0.3rem 10px; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + display: inline-flex; + justify-content: center; + align-items: center; + text-decoration: none; + height: 2rem; + border-radius: 4px; + width: 2rem; + margin: 0.3rem 10px; } + .v-pagination__navigation .v-icon { - font-size: 2rem; - transition: 0.2s cubic-bezier(0.4, 0, 0.6, 1); - vertical-align: middle; + font-size: 2rem; + transition: 0.2s cubic-bezier(0.4, 0, 0.6, 1); + vertical-align: middle; } + .v-pagination__navigation--disabled { - opacity: 0.6; - pointer-events: none; + opacity: 0.6; + pointer-events: none; } + .v-pagination__more { - margin: 0.3rem; - display: inline-flex; - align-items: flex-end; - justify-content: center; - height: 2rem; - width: 2rem; + margin: 0.3rem; + display: inline-flex; + align-items: flex-end; + justify-content: center; + height: 2rem; + width: 2rem; } .v-parallax { - position: relative; - overflow: hidden; - z-index: 0; + position: relative; + overflow: hidden; + z-index: 0; } + .v-parallax__image-container { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 1; - contain: strict; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1; + contain: strict; } + .v-parallax__image { - position: absolute; - bottom: 0; - left: 50%; - min-width: 100%; - min-height: 100%; - display: none; - -webkit-transform: translate(-50%, 0); - transform: translate(-50%, 0); - will-change: transform; - transition: 0.3s opacity cubic-bezier(0.25, 0.8, 0.5, 1); - z-index: 1; + position: absolute; + bottom: 0; + left: 50%; + min-width: 100%; + min-height: 100%; + display: none; + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); + will-change: transform; + transition: 0.3s opacity cubic-bezier(0.25, 0.8, 0.5, 1); + z-index: 1; } + .v-parallax__content { - color: #fff; - height: 100%; - z-index: 2; - position: relative; - display: flex; - flex-direction: column; - justify-content: center; - padding: 0 1rem; + color: #fff; + height: 100%; + z-index: 2; + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + padding: 0 1rem; } .v-input--radio-group .v-radio { - margin-bottom: 8px; + margin-bottom: 8px; } + .v-input--radio-group__input { - display: flex; - width: 100%; + display: flex; + width: 100%; } + .v-input--radio-group__input > .v-label { - padding-bottom: 8px; + padding-bottom: 8px; } + .v-input--radio-group--row .v-input--radio-group__input { - flex-direction: row; - flex-wrap: wrap; + flex-direction: row; + flex-wrap: wrap; } + .v-input--radio-group--column .v-input--radio-group__input { - flex-direction: column; + flex-direction: column; } .theme--light.v-radio--is-disabled label { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-radio--is-disabled .v-icon { - color: rgba(0,0,0,0.26) !important; + color: rgba(0, 0, 0, 0.26) !important; } + .theme--dark.v-radio--is-disabled label { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-radio--is-disabled .v-icon { - color: rgba(255,255,255,0.3) !important; + color: rgba(255, 255, 255, 0.3) !important; } + .v-radio { - align-items: center; - display: flex; - height: auto; - margin-right: 16px; - outline: none; + align-items: center; + display: flex; + height: auto; + margin-right: 16px; + outline: none; } + .v-radio--is-disabled { - pointer-events: none; + pointer-events: none; } /* Theme */ .theme--light.v-input--range-slider.v-input--slider.v-input--is-disabled .v-slider.v-slider .v-slider__thumb { - background: #bdbdbd; + background: #bdbdbd; } + .theme--dark.v-input--range-slider.v-input--slider.v-input--is-disabled .v-slider.v-slider .v-slider__thumb { - background: #424242; + background: #424242; } + /** Input Group */ .v-input--range-slider.v-input--is-disabled .v-slider__track-fill { - display: none; + display: none; } + .v-input--range-slider.v-input--is-disabled.v-input--slider .v-slider.v-slider .v-slider__thumb { - border-color: transparent; + border-color: transparent; } /* Theme */ .theme--light.v-input--slider .v-slider__track, .theme--light.v-input--slider .v-slider__track-fill { - background: rgba(0,0,0,0.26); + background: rgba(0, 0, 0, 0.26); } + .theme--light.v-input--slider .v-slider__track__container:after { - border: 1px solid rgba(0,0,0,0.87); + border: 1px solid rgba(0, 0, 0, 0.87); } + .theme--light.v-input--slider .v-slider__ticks { - border-color: rgba(0,0,0,0.87); - color: rgba(0,0,0,0.54); + border-color: rgba(0, 0, 0, 0.87); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-input--slider:not(.v-input--is-dirty) .v-slider__thumb-label { - background: rgba(0,0,0,0.26); + background: rgba(0, 0, 0, 0.26); } + .theme--light.v-input--slider:not(.v-input--is-dirty) .v-slider__thumb { - border: 3px solid rgba(0,0,0,0.26); + border: 3px solid rgba(0, 0, 0, 0.26); } + .theme--light.v-input--slider:not(.v-input--is-dirty).v-input--slider--is-active .v-slider__thumb { - border: 3px solid rgba(0,0,0,0.38); + border: 3px solid rgba(0, 0, 0, 0.38); } + .theme--light.v-input--slider.v-input--is-disabled .v-slider__thumb { - border: 5px solid rgba(0,0,0,0.26); + border: 5px solid rgba(0, 0, 0, 0.26); } + .theme--light.v-input--slider.v-input--is-disabled.v-input--is-dirty .v-slider__thumb { - background: rgba(0,0,0,0.26); + background: rgba(0, 0, 0, 0.26); } + .theme--light.v-input--slider.v-input--slider--is-active .v-slider__track { - background: rgba(0,0,0,0.38); + background: rgba(0, 0, 0, 0.38); } + .theme--dark.v-input--slider .v-slider__track, .theme--dark.v-input--slider .v-slider__track-fill { - background: rgba(255,255,255,0.2); + background: rgba(255, 255, 255, 0.2); } + .theme--dark.v-input--slider .v-slider__track__container:after { - border: 1px solid #fff; + border: 1px solid #fff; } + .theme--dark.v-input--slider .v-slider__ticks { - border-color: #fff; - color: rgba(255,255,255,0.7); + border-color: #fff; + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-input--slider:not(.v-input--is-dirty) .v-slider__thumb-label { - background: rgba(255,255,255,0.2); + background: rgba(255, 255, 255, 0.2); } + .theme--dark.v-input--slider:not(.v-input--is-dirty) .v-slider__thumb { - border: 3px solid rgba(255,255,255,0.2); + border: 3px solid rgba(255, 255, 255, 0.2); } + .theme--dark.v-input--slider:not(.v-input--is-dirty).v-input--slider--is-active .v-slider__thumb { - border: 3px solid rgba(255,255,255,0.3); + border: 3px solid rgba(255, 255, 255, 0.3); } + .theme--dark.v-input--slider.v-input--is-disabled .v-slider__thumb { - border: 5px solid rgba(255,255,255,0.2); + border: 5px solid rgba(255, 255, 255, 0.2); } + .theme--dark.v-input--slider.v-input--is-disabled.v-input--is-dirty .v-slider__thumb { - background: rgba(255,255,255,0.2); + background: rgba(255, 255, 255, 0.2); } + .theme--dark.v-input--slider.v-input--slider--is-active .v-slider__track { - background: rgba(255,255,255,0.3); + background: rgba(255, 255, 255, 0.3); } + .application--is-rtl .v-input--slider .v-label { - margin-left: 16px; - margin-right: 0; + margin-left: 16px; + margin-right: 0; } + /** Input Group */ .v-input--slider { - margin-top: 16px; + margin-top: 16px; } + .v-input--slider.v-input--is-focused .v-slider__thumb-container--is-active:not(.v-slider__thumb-container--show-label):before { - opacity: 0.2; - -webkit-transform: scale(1); - transform: scale(1); + opacity: 0.2; + -webkit-transform: scale(1); + transform: scale(1); } + .v-input--slider.v-input--is-focused .v-slider__track { - transition: none; + transition: none; } + .v-input--slider.v-input--is-focused.v-input--slider--ticks .v-slider__track__container:after, .v-input--slider.v-input--is-focused.v-input--slider--ticks .v-slider .v-slider__tick { - opacity: 1; + opacity: 1; } + .v-input--slider.v-input--slider--ticks .v-slider__ticks.v-slider__ticks--always-show { - opacity: 1; + opacity: 1; } + .v-input--slider.v-input--slider--ticks-labels .v-input__slot { - margin-bottom: 16px; + margin-bottom: 16px; } + .v-input--slider.v-input--is-readonly { - pointer-events: none; + pointer-events: none; } + .v-input--slider.v-input--is-disabled .v-slider__thumb { - -webkit-transform: translateY(-50%) scale(0.45); - transform: translateY(-50%) scale(0.45); + -webkit-transform: translateY(-50%) scale(0.45); + transform: translateY(-50%) scale(0.45); } + .v-input--slider.v-input--is-disabled.v-input--is-dirty .v-slider__thumb { - border: 0px solid transparent; + border: 0px solid transparent; } + .v-input--slider .v-input__slot > *:first-child:not(:only-child) { - margin-right: 16px; + margin-right: 16px; } + /** Slider */ .v-slider { - cursor: default; - display: flex; - align-items: center; - position: relative; - height: 32px; - flex: 1; - outline: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + cursor: default; + display: flex; + align-items: center; + position: relative; + height: 32px; + flex: 1; + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-slider input { - cursor: default; - opacity: 0; - padding: 0; - width: 100%; + cursor: default; + opacity: 0; + padding: 0; + width: 100%; } + /** Thumb/Track/Ticks */ .v-slider__track__container { - height: 2px; - left: 0; - overflow: hidden; - pointer-events: none; - position: absolute; - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - width: 100%; + height: 2px; + left: 0; + overflow: hidden; + pointer-events: none; + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + width: 100%; } + .v-slider__track__container:after { - content: ''; - position: absolute; - right: 0; - top: 0; - height: 2px; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - width: 2px; - opacity: 0; + content: ''; + position: absolute; + right: 0; + top: 0; + height: 2px; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + width: 2px; + opacity: 0; } + .v-slider__track, .v-slider__thumb, .v-slider__ticks { - position: absolute; - top: 0; + position: absolute; + top: 0; } + .v-slider__track { - height: 2px; - left: 0; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - -webkit-transform-origin: right; - transform-origin: right; - overflow: hidden; - width: 100%; + height: 2px; + left: 0; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + -webkit-transform-origin: right; + transform-origin: right; + overflow: hidden; + width: 100%; } + .v-slider__track-fill { - position: absolute; - left: 0; - height: 2px; - -webkit-transform-origin: left; - transform-origin: left; - width: 100%; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + position: absolute; + left: 0; + height: 2px; + -webkit-transform-origin: left; + transform-origin: left; + width: 100%; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-slider__ticks-container { - position: absolute; - left: 0; - height: 2px; - width: 100%; - top: 50%; - -webkit-transform: translate(0, -50%); - transform: translate(0, -50%); + position: absolute; + left: 0; + height: 2px; + width: 100%; + top: 50%; + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); } + .v-slider__ticks { - opacity: 0; - border-style: solid; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + opacity: 0; + border-style: solid; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-slider__ticks > span { - position: absolute; - top: 8px; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); - white-space: nowrap; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + position: absolute; + top: 8px; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-slider__ticks:first-child > span { - -webkit-transform: translateX(0); - transform: translateX(0); + -webkit-transform: translateX(0); + transform: translateX(0); } + .v-slider__ticks:last-child > span { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); + -webkit-transform: translateX(-100%); + transform: translateX(-100%); } + .v-slider:not(.v-input--is-dirty) .v-slider__ticks:first-child { - border-color: transparent; + border-color: transparent; } + .v-slider__thumb-container { - position: absolute; - top: 50%; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + position: absolute; + top: 50%; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-slider__thumb-container:before { - content: ''; - color: inherit; - border-radius: 50%; - background: currentColor; - height: 32px; - left: -16px; - opacity: 0; - overflow: hidden; - pointer-events: none; - position: absolute; - top: -16px; - -webkit-transform: scale(0.2); - transform: scale(0.2); - transition: 0.4s cubic-bezier(0, 0, 0.2, 1); - width: 32px; - will-change: transform, opacity; + content: ''; + color: inherit; + border-radius: 50%; + background: currentColor; + height: 32px; + left: -16px; + opacity: 0; + overflow: hidden; + pointer-events: none; + position: absolute; + top: -16px; + -webkit-transform: scale(0.2); + transform: scale(0.2); + transition: 0.4s cubic-bezier(0, 0, 0.2, 1); + width: 32px; + will-change: transform, opacity; } + .v-slider__thumb { - width: 24px; - height: 24px; - left: -12px; - top: 50%; - border-radius: 50%; - background: transparent; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - -webkit-transform: translateY(-50%) scale(0.6); - transform: translateY(-50%) scale(0.6); - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + width: 24px; + height: 24px; + left: -12px; + top: 50%; + border-radius: 50%; + background: transparent; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + -webkit-transform: translateY(-50%) scale(0.6); + transform: translateY(-50%) scale(0.6); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + /** Thumb Label */ .v-slider--is-active .v-slider__thumb-container--is-active .v-slider__thumb { - -webkit-transform: translateY(-50%) scale(1); - transform: translateY(-50%) scale(1); + -webkit-transform: translateY(-50%) scale(1); + transform: translateY(-50%) scale(1); } + .v-slider--is-active .v-slider__thumb-container--is-active.v-slider__thumb-container--show-label .v-slider__thumb { - -webkit-transform: translateY(-50%) scale(0); - transform: translateY(-50%) scale(0); + -webkit-transform: translateY(-50%) scale(0); + transform: translateY(-50%) scale(0); } + .v-slider--is-active .v-slider__ticks-container .v-slider__ticks { - opacity: 1; + opacity: 1; } + .v-slider__thumb-label__container { - position: absolute; - left: 0; - top: 0; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + position: absolute; + left: 0; + top: 0; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } + .v-slider__thumb-label { - display: flex; - align-items: center; - justify-content: center; - font-size: 12px; - color: #fff; - width: 32px; - height: 32px; - border-radius: 50% 50% 0; - position: absolute; - left: 0; - bottom: 100%; - -webkit-transform: translateY(-20%) translateY(-12px) translateX(-50%) rotate(45deg); - transform: translateY(-20%) translateY(-12px) translateX(-50%) rotate(45deg); - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + color: #fff; + width: 32px; + height: 32px; + border-radius: 50% 50% 0; + position: absolute; + left: 0; + bottom: 100%; + -webkit-transform: translateY(-20%) translateY(-12px) translateX(-50%) rotate(45deg); + transform: translateY(-20%) translateY(-12px) translateX(-50%) rotate(45deg); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } + .v-slider__thumb-label > * { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } + .v-slider__track, .v-slider__track-fill { - position: absolute; + position: absolute; } .v-rating .v-icon { - padding: 0.5rem; - border-radius: 50%; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + padding: 0.5rem; + border-radius: 50%; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-rating--readonly .v-icon { - pointer-events: none; + pointer-events: none; } + .v-rating--dense .v-icon { - padding: 0.1rem; + padding: 0.1rem; } .v-snack { - position: fixed; - display: flex; - align-items: center; - color: #fff; - pointer-events: none; - z-index: 1000; - font-size: 14px; - left: 0; - right: 0; + position: fixed; + display: flex; + align-items: center; + color: #fff; + pointer-events: none; + z-index: 1000; + font-size: 14px; + left: 0; + right: 0; } + .v-snack--absolute { - position: absolute; + position: absolute; } + .v-snack--top { - top: 0; + top: 0; } + .v-snack--bottom { - bottom: 0; + bottom: 0; } + .v-snack__wrapper { - display: flex; - align-items: center; - background-color: #323232; - pointer-events: auto; - width: 100%; - box-shadow: 0px 3px 5px -1px rgba(0,0,0,0.2), 0px 6px 10px 0px rgba(0,0,0,0.14), 0px 1px 18px 0px rgba(0,0,0,0.12); + display: flex; + align-items: center; + background-color: #323232; + pointer-events: auto; + width: 100%; + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); } + .v-snack__content { - width: 100%; - height: 48px; - padding: 14px 24px; - display: flex; - align-items: center; - justify-content: space-between; - overflow: hidden; + width: 100%; + height: 48px; + padding: 14px 24px; + display: flex; + align-items: center; + justify-content: space-between; + overflow: hidden; } + .v-snack__content .v-btn { - color: #fff; - flex: 0 0 auto; - padding: 8px; - margin: 0 0 0 24px; - height: auto; - min-width: auto; - width: auto; + color: #fff; + flex: 0 0 auto; + padding: 8px; + margin: 0 0 0 24px; + height: auto; + min-width: auto; + width: auto; } + .v-snack__content .v-btn__content { - margin: -2px; + margin: -2px; } + .v-snack__content .v-btn::before { - display: none; + display: none; } + .v-snack--multi-line .v-snack__content { - height: 80px; - padding: 24px; + height: 80px; + padding: 24px; } + .v-snack--vertical .v-snack__content { - height: 112px; - padding: 24px 24px 14px; - flex-direction: column; - align-items: stretch; + height: 112px; + padding: 24px 24px 14px; + flex-direction: column; + align-items: stretch; } + .v-snack--vertical .v-snack__content .v-btn.v-btn { - justify-content: flex-end; - padding: 0; - margin-left: 0; - margin-top: 24px; + justify-content: flex-end; + padding: 0; + margin-left: 0; + margin-top: 24px; } + .v-snack--vertical .v-snack__content .v-btn__content { - flex: 0 0 auto; - margin: 0; + flex: 0 0 auto; + margin: 0; } + .v-snack--auto-height .v-snack__content { - height: auto; + height: auto; } + .v-snack-transition-enter-active, .v-snack-transition-leave-active { - transition: -webkit-transform 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); - transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); - transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.5, 1), -webkit-transform 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: -webkit-transform 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.5, 1), -webkit-transform 0.4s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-snack-transition-enter-active .v-snack__content, .v-snack-transition-leave-active .v-snack__content { - transition: opacity 0.3s linear 0.1s; + transition: opacity 0.3s linear 0.1s; } + .v-snack-transition-enter .v-snack__content { - opacity: 0; + opacity: 0; } + .v-snack-transition-enter-to .v-snack__content, .v-snack-transition-leave .v-snack__content { - opacity: 1; + opacity: 1; } + .v-snack-transition-enter.v-snack.v-snack--top, .v-snack-transition-leave-to.v-snack.v-snack--top { - -webkit-transform: translateY(calc(-100% - 8px)); - transform: translateY(calc(-100% - 8px)); + -webkit-transform: translateY(calc(-100% - 8px)); + transform: translateY(calc(-100% - 8px)); } + .v-snack-transition-enter.v-snack.v-snack--bottom, .v-snack-transition-leave-to.v-snack.v-snack--bottom { - -webkit-transform: translateY(100%); - transform: translateY(100%); + -webkit-transform: translateY(100%); + transform: translateY(100%); } + @media only screen and (min-width: 600px) { - .v-snack__wrapper { - width: auto; - max-width: 568px; - min-width: 288px; - margin: 0 auto; - border-radius: 2px; - } - .v-snack--left .v-snack__wrapper { - margin-left: 0; - } - .v-snack--right .v-snack__wrapper { - margin-right: 0; - } - .v-snack--left, - .v-snack--right { - margin: 0 24px; - } - .v-snack--left.v-snack--top, - .v-snack--right.v-snack--top { - -webkit-transform: translateY(24px); - transform: translateY(24px); - } - .v-snack--left.v-snack--bottom, - .v-snack--right.v-snack--bottom { - -webkit-transform: translateY(-24px); - transform: translateY(-24px); - } - .v-snack__content .v-btn:first-of-type { - margin-left: 42px; - } + .v-snack__wrapper { + width: auto; + max-width: 568px; + min-width: 288px; + margin: 0 auto; + border-radius: 2px; + } + + .v-snack--left .v-snack__wrapper { + margin-left: 0; + } + + .v-snack--right .v-snack__wrapper { + margin-right: 0; + } + + .v-snack--left, + .v-snack--right { + margin: 0 24px; + } + + .v-snack--left.v-snack--top, + .v-snack--right.v-snack--top { + -webkit-transform: translateY(24px); + transform: translateY(24px); + } + + .v-snack--left.v-snack--bottom, + .v-snack--right.v-snack--bottom { + -webkit-transform: translateY(-24px); + transform: translateY(-24px); + } + + .v-snack__content .v-btn:first-of-type { + margin-left: 42px; + } } .v-speed-dial { - position: relative; + position: relative; } + .v-speed-dial--absolute { - position: absolute; + position: absolute; } + .v-speed-dial--fixed { - position: fixed; + position: fixed; } + .v-speed-dial--fixed, .v-speed-dial--absolute { - z-index: 4; + z-index: 4; } + .v-speed-dial--fixed > .v-btn--floating, .v-speed-dial--absolute > .v-btn--floating { - margin: 0; + margin: 0; } + .v-speed-dial--top:not(.v-speed-dial--absolute) { - top: 16px; + top: 16px; } + .v-speed-dial--top.v-speed-dial--absolute { - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); } + .v-speed-dial--bottom:not(.v-speed-dial--absolute) { - bottom: 16px; + bottom: 16px; } + .v-speed-dial--bottom.v-speed-dial--absolute { - bottom: 50%; - -webkit-transform: translateY(50%); - transform: translateY(50%); + bottom: 50%; + -webkit-transform: translateY(50%); + transform: translateY(50%); } + .v-speed-dial--left { - left: 16px; + left: 16px; } + .v-speed-dial--right { - right: 16px; + right: 16px; } + .v-speed-dial--direction-left .v-speed-dial__list, .v-speed-dial--direction-right .v-speed-dial__list { - height: 100%; - top: 0; + height: 100%; + top: 0; } + .v-speed-dial--direction-top .v-speed-dial__list, .v-speed-dial--direction-bottom .v-speed-dial__list { - left: 0; - width: 100%; + left: 0; + width: 100%; } + .v-speed-dial--direction-top .v-speed-dial__list { - flex-direction: column-reverse; - bottom: 100%; + flex-direction: column-reverse; + bottom: 100%; } + .v-speed-dial--direction-right .v-speed-dial__list { - flex-direction: row; - left: 100%; + flex-direction: row; + left: 100%; } + .v-speed-dial--direction-bottom .v-speed-dial__list { - flex-direction: column; - top: 100%; + flex-direction: column; + top: 100%; } + .v-speed-dial--direction-left .v-speed-dial__list { - flex-direction: row-reverse; - right: 100%; + flex-direction: row-reverse; + right: 100%; } + /** Elements */ .v-speed-dial__list { - align-items: center; - display: flex; - justify-content: center; - position: absolute; + align-items: center; + display: flex; + justify-content: center; + position: absolute; } + .v-speed-dial__list .v-btn:nth-child(1) { - transition-delay: 0.05s; + transition-delay: 0.05s; } + .v-speed-dial__list .v-btn:nth-child(2) { - transition-delay: 0.1s; + transition-delay: 0.1s; } + .v-speed-dial__list .v-btn:nth-child(3) { - transition-delay: 0.15s; + transition-delay: 0.15s; } + .v-speed-dial__list .v-btn:nth-child(4) { - transition-delay: 0.2s; + transition-delay: 0.2s; } + .v-speed-dial__list .v-btn:nth-child(5) { - transition-delay: 0.25s; + transition-delay: 0.25s; } + .v-speed-dial__list .v-btn:nth-child(6) { - transition-delay: 0.3s; + transition-delay: 0.3s; } + .v-speed-dial__list .v-btn:nth-child(7) { - transition-delay: 0.35s; + transition-delay: 0.35s; } .theme--light.v-stepper { - background: #fff; + background: #fff; } + .theme--light.v-stepper .v-stepper__step:not(.v-stepper__step--active):not(.v-stepper__step--complete):not(.v-stepper__step--error) .v-stepper__step__step { - background: rgba(0,0,0,0.38); + background: rgba(0, 0, 0, 0.38); } + .theme--light.v-stepper .v-stepper__step__step { - color: #fff; + color: #fff; } + .theme--light.v-stepper .v-stepper__step__step .v-icon { - color: #fff; + color: #fff; } + .theme--light.v-stepper .v-stepper__header .v-divider { - border-color: rgba(0,0,0,0.12); + border-color: rgba(0, 0, 0, 0.12); } + .theme--light.v-stepper .v-stepper__step--active .v-stepper__label { - text-shadow: 0px 0px 0px #000; + text-shadow: 0px 0px 0px #000; } + .theme--light.v-stepper .v-stepper__step--editable:hover { - background: rgba(0,0,0,0.06); + background: rgba(0, 0, 0, 0.06); } + .theme--light.v-stepper .v-stepper__step--editable:hover .v-stepper__label { - text-shadow: 0px 0px 0px #000; + text-shadow: 0px 0px 0px #000; } + .theme--light.v-stepper .v-stepper__step--complete .v-stepper__label { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-stepper .v-stepper__step--inactive.v-stepper__step--editable:not(.v-stepper__step--error):hover .v-stepper__step__step { - background: rgba(0,0,0,0.54); + background: rgba(0, 0, 0, 0.54); } + .theme--light.v-stepper .v-stepper__label { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-stepper .v-stepper__label small { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-stepper--non-linear .v-stepper__step:not(.v-stepper__step--complete):not(.v-stepper__step--error) .v-stepper__label { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-stepper--vertical .v-stepper__content:not(:last-child) { - border-left: 1px solid rgba(0,0,0,0.12); + border-left: 1px solid rgba(0, 0, 0, 0.12); } + .theme--dark.v-stepper { - background: #303030; + background: #303030; } + .theme--dark.v-stepper .v-stepper__step:not(.v-stepper__step--active):not(.v-stepper__step--complete):not(.v-stepper__step--error) .v-stepper__step__step { - background: rgba(255,255,255,0.5); + background: rgba(255, 255, 255, 0.5); } + .theme--dark.v-stepper .v-stepper__step__step { - color: #fff; + color: #fff; } + .theme--dark.v-stepper .v-stepper__step__step .v-icon { - color: #fff; + color: #fff; } + .theme--dark.v-stepper .v-stepper__header .v-divider { - border-color: rgba(255,255,255,0.12); + border-color: rgba(255, 255, 255, 0.12); } + .theme--dark.v-stepper .v-stepper__step--active .v-stepper__label { - text-shadow: 0px 0px 0px #fff; + text-shadow: 0px 0px 0px #fff; } + .theme--dark.v-stepper .v-stepper__step--editable:hover { - background: rgba(255,255,255,0.06); + background: rgba(255, 255, 255, 0.06); } + .theme--dark.v-stepper .v-stepper__step--editable:hover .v-stepper__label { - text-shadow: 0px 0px 0px #fff; + text-shadow: 0px 0px 0px #fff; } + .theme--dark.v-stepper .v-stepper__step--complete .v-stepper__label { - color: rgba(255,255,255,0.87); + color: rgba(255, 255, 255, 0.87); } + .theme--dark.v-stepper .v-stepper__step--inactive.v-stepper__step--editable:not(.v-stepper__step--error):hover .v-stepper__step__step { - background: rgba(255,255,255,0.75); + background: rgba(255, 255, 255, 0.75); } + .theme--dark.v-stepper .v-stepper__label { - color: rgba(255,255,255,0.5); + color: rgba(255, 255, 255, 0.5); } + .theme--dark.v-stepper .v-stepper__label small { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-stepper--non-linear .v-stepper__step:not(.v-stepper__step--complete):not(.v-stepper__step--error) .v-stepper__label { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-stepper--vertical .v-stepper__content:not(:last-child) { - border-left: 1px solid rgba(255,255,255,0.12); + border-left: 1px solid rgba(255, 255, 255, 0.12); } + .v-stepper { - overflow: hidden; - position: relative; - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); + overflow: hidden; + position: relative; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } + .v-stepper__header { - height: 72px; - align-items: stretch; - display: flex; - flex-wrap: wrap; - justify-content: space-between; - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); + height: 72px; + align-items: stretch; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } + .v-stepper__header .v-divider { - align-self: center; - margin: 0 -16px; + align-self: center; + margin: 0 -16px; } + .v-stepper__items { - position: relative; - overflow: hidden; + position: relative; + overflow: hidden; } + .v-stepper__step__step { - align-items: center; - border-radius: 50%; - display: inline-flex; - font-size: 12px; - justify-content: center; - height: 24px; - margin-right: 8px; - min-width: 24px; - width: 24px; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + align-items: center; + border-radius: 50%; + display: inline-flex; + font-size: 12px; + justify-content: center; + height: 24px; + margin-right: 8px; + min-width: 24px; + width: 24px; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } + .v-stepper__step__step .v-icon { - font-size: 18px; + font-size: 18px; } + .v-stepper__step { - align-items: center; - display: flex; - flex-direction: row; - padding: 24px; - position: relative; + align-items: center; + display: flex; + flex-direction: row; + padding: 24px; + position: relative; } + .v-stepper__step--active .v-stepper__label { - transition: 0.3s cubic-bezier(0.4, 0, 0.6, 1); + transition: 0.3s cubic-bezier(0.4, 0, 0.6, 1); } + .v-stepper__step--editable { - cursor: pointer; + cursor: pointer; } + .v-stepper__step.v-stepper__step--error .v-stepper__step__step { - background: transparent; - color: inherit; + background: transparent; + color: inherit; } + .v-stepper__step.v-stepper__step--error .v-stepper__step__step .v-icon { - font-size: 24px; - color: inherit; + font-size: 24px; + color: inherit; } + .v-stepper__step.v-stepper__step--error .v-stepper__label { - color: inherit; - text-shadow: none; - font-weight: 500; + color: inherit; + text-shadow: none; + font-weight: 500; } + .v-stepper__step.v-stepper__step--error .v-stepper__label small { - color: inherit; + color: inherit; } + .v-stepper__label { - align-items: flex-start; - display: flex; - flex-direction: column; - text-align: left; + align-items: flex-start; + display: flex; + flex-direction: column; + text-align: left; } + .v-stepper__label small { - font-size: 12px; - font-weight: 300; - text-shadow: none; + font-size: 12px; + font-weight: 300; + text-shadow: none; } + .v-stepper__wrapper { - overflow: hidden; - transition: none; + overflow: hidden; + transition: none; } + .v-stepper__content { - top: 0; - padding: 24px 24px 16px 24px; - flex: 1 0 auto; - width: 100%; + top: 0; + padding: 24px 24px 16px 24px; + flex: 1 0 auto; + width: 100%; } + .v-stepper__content > .v-btn { - margin: 24px 8px 8px 0; + margin: 24px 8px 8px 0; } + .v-stepper--is-booted .v-stepper__content, .v-stepper--is-booted .v-stepper__wrapper { - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-stepper--vertical { - padding-bottom: 36px; + padding-bottom: 36px; } + .v-stepper--vertical .v-stepper__content { - margin: -8px -36px -16px 36px; - padding: 16px 60px 16px 23px; - width: auto; + margin: -8px -36px -16px 36px; + padding: 16px 60px 16px 23px; + width: auto; } + .v-stepper--vertical .v-stepper__step { - padding: 24px 24px 16px; + padding: 24px 24px 16px; } + .v-stepper--vertical .v-stepper__step__step { - margin-right: 12px; + margin-right: 12px; } + .v-stepper--alt-labels .v-stepper__header { - height: auto; + height: auto; } + .v-stepper--alt-labels .v-stepper__header .v-divider { - margin: 35px -67px 0; - align-self: flex-start; + margin: 35px -67px 0; + align-self: flex-start; } + .v-stepper--alt-labels .v-stepper__step { - flex-direction: column; - justify-content: flex-start; - align-items: center; - flex-basis: 175px; + flex-direction: column; + justify-content: flex-start; + align-items: center; + flex-basis: 175px; } + .v-stepper--alt-labels .v-stepper__step small { - align-self: center; + align-self: center; } + .v-stepper--alt-labels .v-stepper__step__step { - margin-right: 0; - margin-bottom: 11px; + margin-right: 0; + margin-bottom: 11px; } + @media only screen and (max-width: 959px) { - .v-stepper:not(.v-stepper--vertical) .v-stepper__label { - display: none; - } - .v-stepper:not(.v-stepper--vertical) .v-stepper__step__step { - margin-right: 0; - } + .v-stepper:not(.v-stepper--vertical) .v-stepper__label { + display: none; + } + + .v-stepper:not(.v-stepper--vertical) .v-stepper__step__step { + margin-right: 0; + } } /** Theme */ .theme--light.v-input--switch__thumb { - color: #fafafa; + color: #fafafa; } + .theme--light.v-input--switch__track { - color: rgba(0,0,0,0.38); + color: rgba(0, 0, 0, 0.38); } + .theme--light.v-input--switch.v-input--is-disabled .v-input--switch__thumb { - color: #bdbdbd !important; + color: #bdbdbd !important; } + .theme--light.v-input--switch.v-input--is-disabled .v-input--switch__track { - color: rgba(0,0,0,0.12) !important; + color: rgba(0, 0, 0, 0.12) !important; } + .theme--dark.v-input--switch__thumb { - color: #bdbdbd; + color: #bdbdbd; } + .theme--dark.v-input--switch__track { - color: rgba(255,255,255,0.3); + color: rgba(255, 255, 255, 0.3); } + .theme--dark.v-input--switch.v-input--is-disabled .v-input--switch__thumb { - color: #424242 !important; + color: #424242 !important; } + .theme--dark.v-input--switch.v-input--is-disabled .v-input--switch__track { - color: rgba(255,255,255,0.1) !important; + color: rgba(255, 255, 255, 0.1) !important; } + .application--is-rtl .v-input--switch .v-input--selection-controls__ripple { - left: auto; - right: -14px; + left: auto; + right: -14px; } + .application--is-rtl .v-input--switch.v-input--is-dirty .v-input--selection-controls__ripple, .application--is-rtl .v-input--switch.v-input--is-dirty .v-input--switch__thumb { - -webkit-transform: translate(-16px, 0); - transform: translate(-16px, 0); + -webkit-transform: translate(-16px, 0); + transform: translate(-16px, 0); } + .v-input--switch__track, .v-input--switch__thumb { - background-color: currentColor; - pointer-events: none; - transition: inherit; + background-color: currentColor; + pointer-events: none; + transition: inherit; } + .v-input--switch__track { - border-radius: 8px; - height: 14px; - left: 2px; - opacity: 0.6; - position: absolute; - right: 2px; - top: calc(50% - 7px); + border-radius: 8px; + height: 14px; + left: 2px; + opacity: 0.6; + position: absolute; + right: 2px; + top: calc(50% - 7px); } + .v-input--switch__thumb { - border-radius: 50%; - top: calc(50% - 10px); - height: 20px; - position: relative; - width: 20px; - box-shadow: 0px 2px 4px -1px rgba(0,0,0,0.2), 0px 4px 5px 0px rgba(0,0,0,0.14), 0px 1px 10px 0px rgba(0,0,0,0.12); + border-radius: 50%; + top: calc(50% - 10px); + height: 20px; + position: relative; + width: 20px; + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); } + .v-input--switch .v-input--selection-controls__input { - width: 38px; + width: 38px; } + .v-input--switch .v-input--selection-controls__ripple { - left: -14px; - top: calc(50% - 24px); + left: -14px; + top: calc(50% - 24px); } + .v-input--switch.v-input--is-dirty .v-input--selection-controls__ripple, .v-input--switch.v-input--is-dirty .v-input--switch__thumb { - -webkit-transform: translate(16px, 0); - transform: translate(16px, 0); + -webkit-transform: translate(16px, 0); + transform: translate(16px, 0); } /* Theme */ .theme--light.v-system-bar { - background-color: #e0e0e0; - color: rgba(0,0,0,0.54); + background-color: #e0e0e0; + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-system-bar .v-icon { - color: rgba(0,0,0,0.54); + color: rgba(0, 0, 0, 0.54); } + .theme--light.v-system-bar--lights-out { - background-color: rgba(255,255,255,0.7) !important; + background-color: rgba(255, 255, 255, 0.7) !important; } + .theme--dark.v-system-bar { - background-color: #000; - color: rgba(255,255,255,0.7); + background-color: #000; + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-system-bar .v-icon { - color: rgba(255,255,255,0.7); + color: rgba(255, 255, 255, 0.7); } + .theme--dark.v-system-bar--lights-out { - background-color: rgba(0,0,0,0.2) !important; + background-color: rgba(0, 0, 0, 0.2) !important; } + .v-system-bar { - align-items: center; - display: flex; - font-size: 14px; - font-weight: 500; - padding: 0 8px; + align-items: center; + display: flex; + font-size: 14px; + font-weight: 500; + padding: 0 8px; } + .v-system-bar .v-icon { - font-size: 16px; + font-size: 16px; } + .v-system-bar--fixed, .v-system-bar--absolute { - left: 0; - top: 0; - width: 100%; - z-index: 3; + left: 0; + top: 0; + width: 100%; + z-index: 3; } + .v-system-bar--fixed { - position: fixed; + position: fixed; } + .v-system-bar--absolute { - position: absolute; + position: absolute; } + .v-system-bar--status .v-icon { - margin-right: 4px; + margin-right: 4px; } + .v-system-bar--window .v-icon { - font-size: 20px; - margin-right: 8px; + font-size: 20px; + margin-right: 8px; } /* Theme */ .theme--light.v-tabs__bar { - background-color: #fff; + background-color: #fff; } + .theme--light.v-tabs__bar .v-tabs__div { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .theme--light.v-tabs__bar .v-tabs__item--disabled { - color: rgba(0,0,0,0.26); + color: rgba(0, 0, 0, 0.26); } + .theme--dark.v-tabs__bar { - background-color: #424242; + background-color: #424242; } + .theme--dark.v-tabs__bar .v-tabs__div { - color: #fff; + color: #fff; } + .theme--dark.v-tabs__bar .v-tabs__item--disabled { - color: rgba(255,255,255,0.3); + color: rgba(255, 255, 255, 0.3); } + .v-tabs { - position: relative; + position: relative; } + .v-tabs__bar { - position: relative; + position: relative; } + .v-tabs__icon { - align-items: center; - cursor: pointer; - display: inline-flex; - height: 100%; - position: absolute; - top: 0; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - width: 32px; + align-items: center; + cursor: pointer; + display: inline-flex; + height: 100%; + position: absolute; + top: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 32px; } + .v-tabs__icon--prev { - left: 4px; + left: 4px; } + .v-tabs__icon--next { - right: 4px; + right: 4px; } + .v-tabs__wrapper { - overflow: hidden; - contain: content; - display: flex; + overflow: hidden; + contain: content; + display: flex; } + .v-tabs__wrapper--show-arrows { - margin-left: 40px; - margin-right: 40px; + margin-left: 40px; + margin-right: 40px; } + .v-tabs__wrapper--show-arrows .v-tabs__container--align-with-title { - padding-left: 16px; + padding-left: 16px; } + .v-tabs__container { - flex: 1 0 auto; - display: flex; - height: 48px; - list-style-type: none; - transition: -webkit-transform 0.6s cubic-bezier(0.86, 0, 0.07, 1); - transition: transform 0.6s cubic-bezier(0.86, 0, 0.07, 1); - transition: transform 0.6s cubic-bezier(0.86, 0, 0.07, 1), -webkit-transform 0.6s cubic-bezier(0.86, 0, 0.07, 1); - white-space: nowrap; - position: relative; + flex: 1 0 auto; + display: flex; + height: 48px; + list-style-type: none; + transition: -webkit-transform 0.6s cubic-bezier(0.86, 0, 0.07, 1); + transition: transform 0.6s cubic-bezier(0.86, 0, 0.07, 1); + transition: transform 0.6s cubic-bezier(0.86, 0, 0.07, 1), -webkit-transform 0.6s cubic-bezier(0.86, 0, 0.07, 1); + white-space: nowrap; + position: relative; } + .v-tabs__container--overflow .v-tabs__div { - flex: 1 0 auto; + flex: 1 0 auto; } + .v-tabs__container--grow .v-tabs__div { - flex: 1 0 auto; - max-width: none; + flex: 1 0 auto; + max-width: none; } + .v-tabs__container--icons-and-text { - height: 72px; + height: 72px; } + .v-tabs__container--align-with-title { - padding-left: 56px; + padding-left: 56px; } + .v-tabs__container--fixed-tabs .v-tabs__div, .v-tabs__container--icons-and-text .v-tabs__div { - min-width: 72px; + min-width: 72px; } + .v-tabs__container--centered > .v-tabs__div:first-child, .v-tabs__container--fixed-tabs > .v-tabs__div:first-child, .v-tabs__container--right > .v-tabs__div:first-child { - margin-left: auto; + margin-left: auto; } + .v-tabs__container--centered .v-tabs__slider-wrapper + .v-tabs__div, .v-tabs__container--fixed-tabs .v-tabs__slider-wrapper + .v-tabs__div, .v-tabs__container--right .v-tabs__slider-wrapper + .v-tabs__div { - margin-left: auto; + margin-left: auto; } + .v-tabs__container--centered > .v-tabs__div:last-child, .v-tabs__container--fixed-tabs > .v-tabs__div:last-child { - margin-right: auto; + margin-right: auto; } + .v-tabs__container--icons-and-text .v-tabs__item { - flex-direction: column-reverse; + flex-direction: column-reverse; } + .v-tabs__container--icons-and-text .v-tabs__item .v-icon { - margin-bottom: 6px; + margin-bottom: 6px; } + .v-tabs__div { - align-items: center; - display: inline-flex; - flex: 0 1 auto; - font-size: 14px; - font-weight: 500; - line-height: normal; - height: inherit; - max-width: 264px; - text-align: center; - text-transform: uppercase; - vertical-align: middle; + align-items: center; + display: inline-flex; + flex: 0 1 auto; + font-size: 14px; + font-weight: 500; + line-height: normal; + height: inherit; + max-width: 264px; + text-align: center; + text-transform: uppercase; + vertical-align: middle; } + .v-tabs__item { - align-items: center; - color: inherit; - display: flex; - flex: 1 1 auto; - height: 100%; - justify-content: center; - max-width: inherit; - padding: 6px 12px; - text-decoration: none; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - white-space: normal; + align-items: center; + color: inherit; + display: flex; + flex: 1 1 auto; + height: 100%; + justify-content: center; + max-width: inherit; + padding: 6px 12px; + text-decoration: none; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: normal; } + .v-tabs__item:not(.v-tabs__item--active) { - opacity: 0.7; + opacity: 0.7; } + .v-tabs__item--disabled { - pointer-events: none; + pointer-events: none; } + .v-tabs__slider { - height: 2px; - width: 100%; + height: 2px; + width: 100%; } + .v-tabs__slider-wrapper { - bottom: 0; - margin: 0 !important; - position: absolute; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + bottom: 0; + margin: 0 !important; + position: absolute; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); } + .v-tabs__items { - overflow: hidden; - position: relative; + overflow: hidden; + position: relative; } + .v-tabs__content { - width: 100%; - transition: -webkit-transform 0.4s cubic-bezier(0.86, 0, 0.07, 1); - transition: transform 0.4s cubic-bezier(0.86, 0, 0.07, 1); - transition: transform 0.4s cubic-bezier(0.86, 0, 0.07, 1), -webkit-transform 0.4s cubic-bezier(0.86, 0, 0.07, 1); + width: 100%; + transition: -webkit-transform 0.4s cubic-bezier(0.86, 0, 0.07, 1); + transition: transform 0.4s cubic-bezier(0.86, 0, 0.07, 1); + transition: transform 0.4s cubic-bezier(0.86, 0, 0.07, 1), -webkit-transform 0.4s cubic-bezier(0.86, 0, 0.07, 1); } + @media only screen and (max-width: 599px) { - .v-tabs__wrapper--show-arrows .v-tabs__container--align-with-title { - padding-left: 24px; - } - .v-tabs__container--fixed-tabs .v-tabs__div { - flex: 1 0 auto; - } + .v-tabs__wrapper--show-arrows .v-tabs__container--align-with-title { + padding-left: 24px; + } + + .v-tabs__container--fixed-tabs .v-tabs__div { + flex: 1 0 auto; + } } + @media only screen and (min-width: 600px) { - .v-tabs__container--fixed-tabs .v-tabs__div, - .v-tabs__container--icons-and-text .v-tabs__div { - min-width: 160px; - } + .v-tabs__container--fixed-tabs .v-tabs__div, + .v-tabs__container--icons-and-text .v-tabs__div { + min-width: 160px; + } } .theme--light.v-textarea.v-text-field--solo-inverted.v-text-field--solo.v-input--is-focused textarea { - color: #fff; + color: #fff; } + .theme--dark.v-textarea.v-text-field--solo-inverted.v-text-field--solo.v-input--is-focused textarea { - color: rgba(0,0,0,0.87); + color: rgba(0, 0, 0, 0.87); } + .application--is-rtl .v-textarea.v-text-field--enclosed .v-text-field__slot { - margin-right: 0; - margin-left: -12px; + margin-right: 0; + margin-left: -12px; } + .application--is-rtl .v-textarea.v-text-field--enclosed .v-text-field__slot textarea { - padding-right: 0; - padding-left: 12px; + padding-right: 0; + padding-left: 12px; } + .v-textarea textarea { - flex: 1 1 auto; - line-height: 18px; - max-width: 100%; - min-height: 32px; - outline: none; - padding: 7px 0 8px; - width: 100%; + flex: 1 1 auto; + line-height: 18px; + max-width: 100%; + min-height: 32px; + outline: none; + padding: 7px 0 8px; + width: 100%; } + .v-textarea .v-text-field__prefix { - padding-top: 4px; - align-self: start; + padding-top: 4px; + align-self: start; } + .v-textarea.v-text-field--full-width .v-text-field__slot textarea, .v-textarea.v-text-field--full-width.v-text-field--single-line .v-text-field__slot textarea { - margin-top: 0; + margin-top: 0; } + .v-textarea.v-text-field--full-width .v-text-field__details, .v-textarea.v-text-field--full-width.v-text-field--single-line .v-text-field__details { - bottom: 4px; + bottom: 4px; } + .v-textarea.v-text-field--enclosed .v-text-field__slot { - margin-right: -12px; + margin-right: -12px; } + .v-textarea.v-text-field--enclosed .v-text-field__slot textarea { - padding-right: 12px; + padding-right: 12px; } + .v-textarea.v-text-field--box .v-text-field__prefix, .v-textarea.v-text-field--enclosed .v-text-field__prefix, .v-textarea.v-text-field--box textarea, .v-textarea.v-text-field--enclosed textarea { - margin-top: 24px; + margin-top: 24px; } + .v-textarea.v-text-field--box.v-text-field--single-line .v-text-field__prefix, .v-textarea.v-text-field--enclosed.v-text-field--single-line .v-text-field__prefix, .v-textarea.v-text-field--box.v-text-field--single-line textarea, .v-textarea.v-text-field--enclosed.v-text-field--single-line textarea { - margin-top: 12px; + margin-top: 12px; } + .v-textarea.v-text-field--box.v-text-field--single-line .v-label, .v-textarea.v-text-field--enclosed.v-text-field--single-line .v-label { - top: 18px; + top: 18px; } + .v-textarea.v-text-field--box.v-text-field--single-line.v-text-field--outline .v-input__control, .v-textarea.v-text-field--enclosed.v-text-field--single-line.v-text-field--outline .v-input__control { - padding-top: 0; + padding-top: 0; } + .v-textarea.v-text-field--solo { - align-items: flex-start; + align-items: flex-start; } + .v-textarea.v-text-field--solo .v-input__prepend-inner, .v-textarea.v-text-field--solo .v-input__prepend-outer, .v-textarea.v-text-field--solo .v-input__append-inner, .v-textarea.v-text-field--solo .v-input__append-outer { - align-self: flex-start; - margin-top: 16px; + align-self: flex-start; + margin-top: 16px; } + .v-textarea--auto-grow textarea { - overflow: hidden; + overflow: hidden; } + .v-textarea--no-resize textarea { - resize: none; + resize: none; } .v-time-picker-title { - color: #fff; - display: flex; - line-height: 1; - justify-content: flex-end; + color: #fff; + display: flex; + line-height: 1; + justify-content: flex-end; } + .v-time-picker-title__time { - white-space: nowrap; + white-space: nowrap; } + .v-time-picker-title__time .v-picker__title__btn, .v-time-picker-title__time span { - align-items: center; - display: inline-flex; - height: 70px; - font-size: 70px; - justify-content: center; + align-items: center; + display: inline-flex; + height: 70px; + font-size: 70px; + justify-content: center; } + .v-time-picker-title__ampm { - align-self: flex-end; - display: flex; - flex-direction: column; - font-size: 16px; - margin: 8px 0 6px 8px; - text-transform: uppercase; + align-self: flex-end; + display: flex; + flex-direction: column; + font-size: 16px; + margin: 8px 0 6px 8px; + text-transform: uppercase; } + .v-time-picker-title__ampm div:only-child { - flex-direction: row; + flex-direction: row; } + .v-picker__title--landscape .v-time-picker-title { - flex-direction: column; - justify-content: center; - height: 100%; + flex-direction: column; + justify-content: center; + height: 100%; } + .v-picker__title--landscape .v-time-picker-title__time { - text-align: right; + text-align: right; } + .v-picker__title--landscape .v-time-picker-title__time .v-picker__title__btn, .v-picker__title--landscape .v-time-picker-title__time span { - height: 55px; - font-size: 55px; + height: 55px; + font-size: 55px; } + .v-picker__title--landscape .v-time-picker-title__ampm { - margin: 16px 0 0; - align-self: initial; - text-align: center; + margin: 16px 0 0; + align-self: initial; + text-align: center; } /** Themes */ .theme--light.v-time-picker-clock { - background: #e0e0e0; + background: #e0e0e0; } + .theme--light.v-time-picker-clock > span.disabled { - color: rgba(0,0,0,0.26); + color: rgba(0, 0, 0, 0.26); } + .theme--light.v-time-picker-clock > span.disabled.active { - color: rgba(255,255,255,0.3); + color: rgba(255, 255, 255, 0.3); } + .theme--light.v-time-picker-clock--indeterminate .v-time-picker-clock__hand { - background-color: #bdbdbd; + background-color: #bdbdbd; } + .theme--light.v-time-picker-clock--indeterminate .v-time-picker-clock__hand:after { - color: #bdbdbd; + color: #bdbdbd; } + .theme--light.v-time-picker-clock--indeterminate > span.active { - background-color: #bdbdbd; + background-color: #bdbdbd; } + .theme--dark.v-time-picker-clock { - background: #616161; + background: #616161; } + .theme--dark.v-time-picker-clock > span.disabled { - color: rgba(255,255,255,0.3); + color: rgba(255, 255, 255, 0.3); } + .theme--dark.v-time-picker-clock > span.disabled.active { - color: rgba(255,255,255,0.3); + color: rgba(255, 255, 255, 0.3); } + .theme--dark.v-time-picker-clock--indeterminate .v-time-picker-clock__hand { - background-color: #757575; + background-color: #757575; } + .theme--dark.v-time-picker-clock--indeterminate .v-time-picker-clock__hand:after { - color: #757575; + color: #757575; } + .theme--dark.v-time-picker-clock--indeterminate > span.active { - background-color: #757575; + background-color: #757575; } + .v-time-picker-clock { - border-radius: 100%; - position: relative; - transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + border-radius: 100%; + position: relative; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-time-picker-clock__container { - display: flex; - align-items: center; - justify-content: center; - padding: 10px; + display: flex; + align-items: center; + justify-content: center; + padding: 10px; } + .v-time-picker-clock__hand { - height: calc(50% - 28px); - width: 2px; - bottom: 50%; - left: calc(50% - 1px); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - position: absolute; - will-change: transform; - z-index: 1; + height: calc(50% - 28px); + width: 2px; + bottom: 50%; + left: calc(50% - 1px); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + position: absolute; + will-change: transform; + z-index: 1; } + .v-time-picker-clock__hand:before { - background: transparent; - border-width: 2px; - border-style: solid; - border-color: inherit; - border-radius: 100%; - width: 10px; - height: 10px; - content: ''; - position: absolute; - top: -3%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); + background: transparent; + border-width: 2px; + border-style: solid; + border-color: inherit; + border-radius: 100%; + width: 10px; + height: 10px; + content: ''; + position: absolute; + top: -3%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); } + .v-time-picker-clock__hand:after { - content: ''; - position: absolute; - height: 8px; - width: 8px; - top: 100%; - left: 50%; - border-radius: 100%; - border-style: solid; - border-color: inherit; - background-color: inherit; - -webkit-transform: translate(calc(-50%), -50%); - transform: translate(calc(-50%), -50%); + content: ''; + position: absolute; + height: 8px; + width: 8px; + top: 100%; + left: 50%; + border-radius: 100%; + border-style: solid; + border-color: inherit; + background-color: inherit; + -webkit-transform: translate(calc(-50%), -50%); + transform: translate(calc(-50%), -50%); } + .v-time-picker-clock > span { - align-items: center; - border-radius: 100%; - cursor: default; - display: flex; - font-size: 16px; - justify-content: center; - left: calc(50% - 40px / 2); - height: 40px; - position: absolute; - text-align: center; - top: calc(50% - 40px / 2); - width: 40px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + align-items: center; + border-radius: 100%; + cursor: default; + display: flex; + font-size: 16px; + justify-content: center; + left: calc(50% - 40px / 2); + height: 40px; + position: absolute; + text-align: center; + top: calc(50% - 40px / 2); + width: 40px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .v-time-picker-clock > span > span { - z-index: 1; + z-index: 1; } + .v-time-picker-clock > span:before, .v-time-picker-clock > span:after { - content: ''; - border-radius: 100%; - position: absolute; - top: 50%; - left: 50%; - height: 14px; - width: 14px; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); + content: ''; + border-radius: 100%; + position: absolute; + top: 50%; + left: 50%; + height: 14px; + width: 14px; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); } + .v-time-picker-clock > span:after, .v-time-picker-clock > span:before { - height: 40px; - width: 40px; + height: 40px; + width: 40px; } + .v-time-picker-clock > span.active { - color: #fff; - cursor: default; - z-index: 2; + color: #fff; + cursor: default; + z-index: 2; } + .v-time-picker-clock > span.disabled { - pointer-events: none; + pointer-events: none; } /* Theme */ .theme--light.v-toolbar { - background-color: #f5f5f5; - color: rgba(0,0,0,0.87); + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.87); } + .theme--dark.v-toolbar { - background-color: #212121; - color: #fff; + background-color: #212121; + color: #fff; } + .v-toolbar { - transition: none; - box-shadow: 0px 2px 4px -1px rgba(0,0,0,0.2), 0px 4px 5px 0px rgba(0,0,0,0.14), 0px 1px 10px 0px rgba(0,0,0,0.12); - position: relative; - width: 100%; - will-change: padding-left, padding-right; + transition: none; + box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); + position: relative; + width: 100%; + will-change: padding-left, padding-right; } + .v-toolbar[data-booted="true"] { - transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); } + .v-toolbar .v-text-field--enclosed, .v-toolbar .v-text-field--box { - margin: 0; + margin: 0; } + .v-toolbar .v-text-field--enclosed .v-text-field__details, .v-toolbar .v-text-field--box .v-text-field__details { - display: none; + display: none; } + /** Children */ .v-toolbar .v-tabs { - width: 100%; + width: 100%; } + .v-toolbar__title { - font-size: 20px; - font-weight: 500; - letter-spacing: 0.02em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + font-size: 20px; + font-weight: 500; + letter-spacing: 0.02em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + .v-toolbar__title:not(:first-child) { - margin-left: 20px; + margin-left: 20px; } + .v-toolbar__content, .v-toolbar__extension { - align-items: center; - display: flex; - padding: 0 24px; + align-items: center; + display: flex; + padding: 0 24px; } + .v-toolbar__content .v-btn--icon, .v-toolbar__extension .v-btn--icon { - margin: 6px; + margin: 6px; } + .v-toolbar__content > *:first-child, .v-toolbar__extension > *:first-child { - margin-left: 0; + margin-left: 0; } + .v-toolbar__content > *:first-child.v-btn--icon, .v-toolbar__extension > *:first-child.v-btn--icon { - margin-left: -6px; + margin-left: -6px; } + .v-toolbar__content > *:first-child.v-menu .v-menu__activator .v-btn, .v-toolbar__extension > *:first-child.v-menu .v-menu__activator .v-btn, .v-toolbar__content > *:first-child.v-tooltip span .v-btn, .v-toolbar__extension > *:first-child.v-tooltip span .v-btn { - margin-left: 0; + margin-left: 0; } + .v-toolbar__content > *:first-child.v-menu .v-menu__activator .v-btn--icon, .v-toolbar__extension > *:first-child.v-menu .v-menu__activator .v-btn--icon, .v-toolbar__content > *:first-child.v-tooltip span .v-btn--icon, .v-toolbar__extension > *:first-child.v-tooltip span .v-btn--icon { - margin-left: -6px; + margin-left: -6px; } + .v-toolbar__content > *:last-child, .v-toolbar__extension > *:last-child { - margin-right: 0; + margin-right: 0; } + .v-toolbar__content > *:last-child.v-btn--icon, .v-toolbar__extension > *:last-child.v-btn--icon { - margin-right: -6px; + margin-right: -6px; } + .v-toolbar__content > *:last-child.v-menu .v-menu__activator .v-btn, .v-toolbar__extension > *:last-child.v-menu .v-menu__activator .v-btn, .v-toolbar__content > *:last-child.v-tooltip span .v-btn, .v-toolbar__extension > *:last-child.v-tooltip span .v-btn { - margin-right: 0; + margin-right: 0; } + .v-toolbar__content > *:last-child.v-menu .v-menu__activator .v-btn--icon, .v-toolbar__extension > *:last-child.v-menu .v-menu__activator .v-btn--icon, .v-toolbar__content > *:last-child.v-tooltip span .v-btn--icon, .v-toolbar__extension > *:last-child.v-tooltip span .v-btn--icon { - margin-right: -6px; + margin-right: -6px; } + .v-toolbar__content > .v-list, .v-toolbar__extension > .v-list { - flex: 1 1 auto; - max-height: 100%; + flex: 1 1 auto; + max-height: 100%; } + .v-toolbar__content > .v-list:first-child, .v-toolbar__extension > .v-list:first-child { - margin-left: -24px; + margin-left: -24px; } + .v-toolbar__content > .v-list:last-child, .v-toolbar__extension > .v-list:last-child { - margin-right: -24px; + margin-right: -24px; } + .v-toolbar__extension > .v-toolbar__title { - margin-left: 72px; + margin-left: 72px; } + .v-toolbar__items { - display: flex; - height: inherit; - max-width: 100%; - padding: 0; + display: flex; + height: inherit; + max-width: 100%; + padding: 0; } + .v-toolbar__items .v-btn { - align-items: center; - align-self: center; + align-items: center; + align-self: center; } + .v-toolbar__items .v-tooltip, .v-toolbar__items .v-tooltip > span { - height: inherit; + height: inherit; } + .v-toolbar__items .v-btn:not(.v-btn--floating):not(.v-btn--icon), .v-toolbar__items .v-menu, .v-toolbar__items .v-menu__activator { - height: inherit; - margin: 0; + height: inherit; + margin: 0; } + /** Types */ .v-toolbar .v-overflow-btn, .v-toolbar .v-btn-toggle { - box-shadow: 0px 0px 0px 0px rgba(0,0,0,0.2), 0px 0px 0px 0px rgba(0,0,0,0.14), 0px 0px 0px 0px rgba(0,0,0,0.12); + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); } + .v-toolbar .v-input { - margin: 0; + margin: 0; } + .v-toolbar .v-overflow-btn .v-input__control:before, .v-toolbar .v-overflow-btn .v-input__slot:before { - display: none; + display: none; } + .v-toolbar--card { - border-radius: 2px 2px 0 0; - box-shadow: 0px 0px 0px 0px rgba(0,0,0,0.2), 0px 0px 0px 0px rgba(0,0,0,0.14), 0px 0px 0px 0px rgba(0,0,0,0.12); + border-radius: 2px 2px 0 0; + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); } + .v-toolbar--fixed { - position: fixed; - z-index: 2; + position: fixed; + z-index: 2; } + .v-toolbar--fixed, .v-toolbar--absolute { - top: 0; - left: 0; + top: 0; + left: 0; } + .v-toolbar--absolute { - position: absolute; - z-index: 2; + position: absolute; + z-index: 2; } + .v-toolbar--floating { - display: inline-flex; - margin: 16px; - width: auto; + display: inline-flex; + margin: 16px; + width: auto; } + .v-toolbar--clipped { - z-index: 3; + z-index: 3; } + @media only screen and (max-width: 959px) { - .v-toolbar__content, - .v-toolbar__extension { - padding: 0 16px; - } - .v-toolbar__content > .v-list:first-child, - .v-toolbar__extension > .v-list:first-child { - margin-left: -16px; - } - .v-toolbar__content > .v-list:last-child, - .v-toolbar__extension > .v-list:last-child { - margin-right: -16px; - } + .v-toolbar__content, + .v-toolbar__extension { + padding: 0 16px; + } + + .v-toolbar__content > .v-list:first-child, + .v-toolbar__extension > .v-list:first-child { + margin-left: -16px; + } + + .v-toolbar__content > .v-list:last-child, + .v-toolbar__extension > .v-list:last-child { + margin-right: -16px; + } } .v-tooltip { - position: relative; + position: relative; } + .v-tooltip__content { - background: #616161; - border-radius: 2px; - color: #fff; - font-size: 12px; - display: inline-block; - padding: 5px 8px; - position: absolute; - text-transform: initial; - transition: 0.15s cubic-bezier(0.25, 0.8, 0.5, 1); - width: auto; - box-shadow: 0px 3px 1px -2px rgba(0,0,0,0.2), 0px 2px 2px 0px rgba(0,0,0,0.14), 0px 1px 5px 0px rgba(0,0,0,0.12); + background: #616161; + border-radius: 2px; + color: #fff; + font-size: 12px; + display: inline-block; + padding: 5px 8px; + position: absolute; + text-transform: initial; + transition: 0.15s cubic-bezier(0.25, 0.8, 0.5, 1); + width: auto; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); } + .v-tooltip__content[class*="-active"] { - pointer-events: none; + pointer-events: none; } + @media only screen and (max-width: 959px) { - .v-tooltip .v-tooltip__content { - padding: 10px 16px; - } + .v-tooltip .v-tooltip__content { + padding: 10px 16px; + } } diff --git a/frontend/src/components/tables/mixins.js b/frontend/src/components/tables/mixins.js index e756445c..9453eeef 100644 --- a/frontend/src/components/tables/mixins.js +++ b/frontend/src/components/tables/mixins.js @@ -1,77 +1,76 @@ - import axios from 'axios' import {lookup_icon} from "@/icons" var searchTableMixin = { - data () { + data() { return { count: 0, entries: [], - search:"", + search: "", loading: true, pagination: {}, rowsPerPageItems: [5, 10, 20, 50, 100], table_class: "elevation-1", } }, - props:{ - ids:{ - type: Array, - default: () => [] - - }, - autofocus: { - type: Boolean, - default: true - } + props: { + ids: { + type: Array, + default: () => [] }, - mounted () { + autofocus: { + type: Boolean, + default: true + } + + }, + mounted() { this.getData() }, watch: { pagination: { - handler () { + handler() { this.getData() }, deep: true }, search: { - handler () { + handler() { this.getData(); }, deep: true }, url: { - handler () { + handler() { this.getData(); }, deep: true } }, computed: { - backend(){ + backend() { return this.$store.state.django_domain; }, - api(){ + api() { return this.$store.state.endpoints.api; }, resource_url() { - return this.$store.state.endpoints.api + '/' + this.otype + '_elastic/?format=json' + return this.$store.state.endpoints.api + '/' + this.otype + '_elastic/?format=json' }, url() { var url = this.resource_url - + '&page='+ this.pagination.page - + '&page_size='+ this.pagination.rowsPerPage - + '&ordering='+ this.descending+ this.pagination.sortBy; - if(this.search){ - url += '&search_multi_match='+ this.search + + '&page=' + this.pagination.page + + '&page_size=' + this.pagination.rowsPerPage + + '&ordering=' + this.descending + this.pagination.sortBy; + if (this.search) { + url += '&search_multi_match=' + this.search } - if(["outputs","timecourses","interventions"].includes(this.otype)){ + if (["outputs", "timecourses", "interventions"].includes(this.otype)) { url += '&normed=true' } - if(this.ids.length > 0){ + if (this.ids.length > 0) { url += '&ids=' + this.ids.join("__") } return url @@ -84,7 +83,7 @@ var searchTableMixin = { icon(key) { return lookup_icon(key) }, - searchUpdate (newValue) { + searchUpdate(newValue) { this.search = newValue }, get_ids(array_of_obj) { @@ -92,12 +91,12 @@ var searchTableMixin = { }, getData() { - if (localStorage.getItem('token')) - { var headers = {Authorization : 'Token ' + localStorage.getItem('token')}} - else { + if (localStorage.getItem('token')) { + var headers = {Authorization: 'Token ' + localStorage.getItem('token')} + } else { headers = {} } - axios.get(this.url,{ headers: headers}) + axios.get(this.url, {headers: headers}) .then(res => { this.entries = res.data.data.data; this.count = res.data.data.count; @@ -113,29 +112,31 @@ var searchTableMixin = { }; var UrlMixin = { - methods: {group_url(pk) { - return this.$store.state.endpoints.api + '/groups_elastic/'+ pk +'/' + methods: { + group_url(pk) { + return this.$store.state.endpoints.api + '/groups_elastic/' + pk + '/' }, individual_url(pk) { - return this.$store.state.endpoints.api + '/individuals_elastic/'+ pk +'/' + return this.$store.state.endpoints.api + '/individuals_elastic/' + pk + '/' }, output_url(pk) { - return this.$store.state.endpoints.api + '/outputs_elastic/'+ pk +'/' + return this.$store.state.endpoints.api + '/outputs_elastic/' + pk + '/' }, timecourse_url(pk) { - return this.$store.state.endpoints.api + '/timecourses_elastic/'+ pk +'/' + return this.$store.state.endpoints.api + '/timecourses_elastic/' + pk + '/' }, timecourses_url(pks) { - return this.$store.state.endpoints.api + '/timecourses_elastic/?ids='+ pks.join('__') + return this.$store.state.endpoints.api + '/timecourses_elastic/?ids=' + pks.join('__') }, intervention_url(pk) { - return this.$store.state.endpoints.api + '/interventions_elastic/'+ pk +'/' + return this.$store.state.endpoints.api + '/interventions_elastic/' + pk + '/' }, reference_url(pk) { - return this.$store.state.endpoints.api + '/references_elastic/'+ pk +'/' + return this.$store.state.endpoints.api + '/references_elastic/' + pk + '/' }, characterica_url(ids) { return this.$store.state.endpoints.api + '/characteristica_elastic/?ids=' + ids.join('__') - },} + }, + } }; -export {searchTableMixin,UrlMixin} \ No newline at end of file +export {searchTableMixin, UrlMixin} \ No newline at end of file diff --git a/frontend/src/icons.js b/frontend/src/icons.js index 4d2253d3..dae790c2 100644 --- a/frontend/src/icons.js +++ b/frontend/src/icons.js @@ -34,21 +34,21 @@ const icons_table = { characteristicas: 'fas fa-ticket-alt', characteristica: 'fas fa-ticket-alt', curation: 'fas fa-book-reader', - previous:'fas fa-arrow-left', - next:'fas fa-arrow-right', - star:'fas fa fa-star', - warning:'fas fa-exclamation-triangle', - private:'fas fa-lock', - public:'fas fa-lock-open', - closed:'fab fa-creative-commons-pd', - open:'fab fa-creative-commons-pd-alt', - na:'fas fa-ban', - success:'fas fa-check-circle', - measurement_types:'fas fa-user-tag' + previous: 'fas fa-arrow-left', + next: 'fas fa-arrow-right', + star: 'fas fa fa-star', + warning: 'fas fa-exclamation-triangle', + private: 'fas fa-lock', + public: 'fas fa-lock-open', + closed: 'fab fa-creative-commons-pd', + open: 'fab fa-creative-commons-pd-alt', + na: 'fas fa-ban', + success: 'fas fa-check-circle', + measurement_types: 'fas fa-user-tag' }; -function lookup_icon(key){ +function lookup_icon(key) { return icons_table[key] } diff --git a/frontend/src/main.js b/frontend/src/main.js index a70807f2..1f01b9c8 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -12,19 +12,50 @@ import './stylus/main.styl' Vue.use(VueResource); import VueAuthImage from 'vue-auth-image'; + Vue.use(VueAuthImage); /** -------------------------------------------------------------- * FontAwesome * -------------------------------------------------------------- */ -import { library } from '@fortawesome/fontawesome-svg-core'; -import { FontAwesomeIcon, FontAwesomeLayers, FontAwesomeLayersText } from '@fortawesome/vue-fontawesome'; - -import { faCoffee, faFileAlt, faUser, faUsers, faFemale, faMale, faCapsules, faProcedures, faFileMedical, - faFileMedicalAlt, faShareSquare, faChartLine, faChartBar, faInfoCircle, faCode, faLaptopCode, faTablet, faTablets, - faCube, faCubes, faUserCog, faUserEdit, faEnvelope, faTicketAlt, faCheckCircle, faTimesCircle, faBookReader, faTrashAlt, - faCommentAlt, faAlignLeft, faFileExcel, faFileCsv, faFilePdf +import {library} from '@fortawesome/fontawesome-svg-core'; +import {FontAwesomeIcon, FontAwesomeLayers, FontAwesomeLayersText} from '@fortawesome/vue-fontawesome'; + +import { + faCoffee, + faFileAlt, + faUser, + faUsers, + faFemale, + faMale, + faCapsules, + faProcedures, + faFileMedical, + faFileMedicalAlt, + faShareSquare, + faChartLine, + faChartBar, + faInfoCircle, + faCode, + faLaptopCode, + faTablet, + faTablets, + faCube, + faCubes, + faUserCog, + faUserEdit, + faEnvelope, + faTicketAlt, + faCheckCircle, + faTimesCircle, + faBookReader, + faTrashAlt, + faCommentAlt, + faAlignLeft, + faFileExcel, + faFileCsv, + faFilePdf } from '@fortawesome/free-solid-svg-icons'; -import { faGithub } from '@fortawesome/free-brands-svg-icons'; +import {faGithub} from '@fortawesome/free-brands-svg-icons'; library.add(faCoffee, faFileAlt, faUser, faUsers, faFemale, faMale, faCapsules, faProcedures, faFileMedical, faFileMedicalAlt, faShareSquare, faChartLine, faChartBar, faInfoCircle, faGithub, faCode, faLaptopCode, faTablet, faTablets, faCube, faCubes, @@ -101,20 +132,18 @@ Vue.config.productionTip = false; new Vue({ - router, - store, - render: h => h(App) + router, + store, + render: h => h(App) }).$mount('#app'); - - -axios.interceptors.request.use(function(config) { - const token = store.state.token; - if (token) { - axios.defaults.headers.common['Authorization'] = 'Token ' + localStorage.getItem('token') - } - return config; - }, function(err) { - return Promise.reject(err); - }); \ No newline at end of file +axios.interceptors.request.use(function (config) { + const token = store.state.token; + if (token) { + axios.defaults.headers.common['Authorization'] = 'Token ' + localStorage.getItem('token') + } + return config; +}, function (err) { + return Promise.reject(err); +}); \ No newline at end of file diff --git a/frontend/src/router.js b/frontend/src/router.js index 66291a96..f3f9a3e9 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -39,134 +39,134 @@ import PasswordReset from './components/auth/PasswordReset'; Vue.use(Router); export default new Router({ - // mode: 'history', - routes: [ - { - path: '/', - name: 'Home', - component: Home - }, - { - path: '/studies', - name: 'Studies', - component: Studies - }, - { - path: '/groups', - name: 'Groups', - component: Groups - }, - { - path: '/individuals', - name: 'Individuals', - component: Individuals - }, - { - path: '/interventions', - name: 'Interventions', - component: Interventions - }, - { - path: '/outputs', - name: 'Outputs', - component: Outputs - }, - { - path: '/timecourses', - name: 'Timecourses', - component: Timecourses - }, - { - path: '/references', - name: 'References', - component: References - }, - { - path: '/curation', - name: 'Curation', - component: Curation - }, - { - path: '/account', - name: 'Account', - component: Account - }, - { - path: '/verification/:id', - name: 'Verification', - component: Verification, - props: true + // mode: 'history', + routes: [ + { + path: '/', + name: 'Home', + component: Home + }, + { + path: '/studies', + name: 'Studies', + component: Studies + }, + { + path: '/groups', + name: 'Groups', + component: Groups + }, + { + path: '/individuals', + name: 'Individuals', + component: Individuals + }, + { + path: '/interventions', + name: 'Interventions', + component: Interventions + }, + { + path: '/outputs', + name: 'Outputs', + component: Outputs + }, + { + path: '/timecourses', + name: 'Timecourses', + component: Timecourses + }, + { + path: '/references', + name: 'References', + component: References + }, + { + path: '/curation', + name: 'Curation', + component: Curation + }, + { + path: '/account', + name: 'Account', + component: Account + }, + { + path: '/verification/:id', + name: 'Verification', + component: Verification, + props: true - }, - { - path: '/registration', - name: 'Registration', - component: Registration - }, - { - path: '/request-password-reset', - name: 'RequestPasswordReset', - component: RequestPasswordReset - }, - { - path: '/reset-password/:id', - name: 'PasswordReset', - component: PasswordReset, - }, - { - path:"/studies/:id", - name:"Study", - component:Study, - props: true - }, - { - path:"/groups/:id", - name:"Group", - component:Group, - props: true - }, - { - path:"/individuals/:id", - name:"Individual", - component:Individual, - props: true - }, - { - path:"/interventions/:id", - name:"Intervention", - component:Intervention, - props: true - }, - { - path: "/outputs/:id", - name: "Output", - component: Output, - props: true - }, - { - path: "/timecourses/:id", - name: "Timecourse", - component: Timecourse, - props: true - }, - { - path: "/references/:id", - name: "Reference", - component: Reference, - props: true - }, - { - path: '/404', - name: '404', - component: Page404 - }, - { - path: '*', - redirect: '/404' - }, - ], - scrollBehavior (to, from, savedPosition) { - return { x: 0, y: 0 } + }, + { + path: '/registration', + name: 'Registration', + component: Registration + }, + { + path: '/request-password-reset', + name: 'RequestPasswordReset', + component: RequestPasswordReset + }, + { + path: '/reset-password/:id', + name: 'PasswordReset', + component: PasswordReset, + }, + { + path: "/studies/:id", + name: "Study", + component: Study, + props: true + }, + { + path: "/groups/:id", + name: "Group", + component: Group, + props: true + }, + { + path: "/individuals/:id", + name: "Individual", + component: Individual, + props: true + }, + { + path: "/interventions/:id", + name: "Intervention", + component: Intervention, + props: true + }, + { + path: "/outputs/:id", + name: "Output", + component: Output, + props: true + }, + { + path: "/timecourses/:id", + name: "Timecourse", + component: Timecourse, + props: true + }, + { + path: "/references/:id", + name: "Reference", + component: Reference, + props: true + }, + { + path: '/404', + name: '404', + component: Page404 + }, + { + path: '*', + redirect: '/404' + }, + ], + scrollBehavior(to, from, savedPosition) { + return {x: 0, y: 0} } }) diff --git a/frontend/src/store.js b/frontend/src/store.js index 843317c8..6dd61043 100644 --- a/frontend/src/store.js +++ b/frontend/src/store.js @@ -13,7 +13,7 @@ Vue.config.devtools = true; var backend_domain = process.env.VUE_APP_API_BASE; -if (!backend_domain){ +if (!backend_domain) { // running in develop, no environment variable set console.error('No PKDB backend set via environment variable: VUE_APP_API_BASE'); } @@ -57,30 +57,30 @@ export default new Vuex.Store({ }, mutations: { - setToken(state, token){ + setToken(state, token) { localStorage.setItem('token', token); state.token = token; }, - clearToken(state){ + clearToken(state) { localStorage.removeItem('token'); state.token = null; }, - setUsername(state, username){ + setUsername(state, username) { localStorage.setItem('username', username); state.username = username; }, - clearUsername(state){ + clearUsername(state) { localStorage.removeItem('username'); state.username = null; }, }, - actions:{ - login(context, payload){ + actions: { + login(context, payload) { // const payload = {username: username, token: token} this.commit('setToken', payload.token); this.commit('setUsername', payload.username); }, - logout(context){ + logout(context) { this.commit('clearToken'); this.commit('clearUsername'); }, diff --git a/frontend/src/utils.js b/frontend/src/utils.js index 126fb52c..410b757a 100644 --- a/frontend/src/utils.js +++ b/frontend/src/utils.js @@ -1,6 +1,6 @@ import axios from 'axios' -function id_from_url(url){ +function id_from_url(url) { var characteristic_id = url.match(/_read\/(\d+)/); return characteristic_id[1]; } @@ -12,27 +12,33 @@ function clean(obj) { } } } + function isEmpty(str) { return (!str || 0 === str.length); } -function fetch_data(url){ + +function fetch_data(url) { axios.get(url) .then(response => { return response.data }) - .catch((error)=>{ + .catch((error) => { console.error(error); }) } -export {id_from_url, clean, isEmpty,fetch_data}; +export {id_from_url, clean, isEmpty, fetch_data}; // vue paginator const merge_objects = (obj1, obj2) => { let obj3 = {}; - for (let attrname in obj1) { obj3[attrname] = obj1[attrname]; } - for (let attrname in obj2) { obj3[attrname] = obj2[attrname]; } + for (let attrname in obj1) { + obj3[attrname] = obj1[attrname]; + } + for (let attrname in obj2) { + obj3[attrname] = obj2[attrname]; + } return obj3; }; @@ -48,5 +54,5 @@ const getNestedValue = (obj, path) => { }; -export const utils = { merge_objects, getNestedValue }; +export const utils = {merge_objects, getNestedValue}; diff --git a/frontend/tests/unit/.eslintrc.js b/frontend/tests/unit/.eslintrc.js index c00d2433..c0cb1e3f 100644 --- a/frontend/tests/unit/.eslintrc.js +++ b/frontend/tests/unit/.eslintrc.js @@ -1,5 +1,5 @@ module.exports = { - env: { - mocha: true - } + env: { + mocha: true + } } \ No newline at end of file diff --git a/frontend/tests/unit/example.spec.js b/frontend/tests/unit/example.spec.js index c585ea33..89bd96a5 100644 --- a/frontend/tests/unit/example.spec.js +++ b/frontend/tests/unit/example.spec.js @@ -1,13 +1,13 @@ -import { expect } from 'chai' -import { shallowMount } from '@vue/test-utils' +import {expect} from 'chai' +import {shallowMount} from '@vue/test-utils' import HelloWorld from '@/components/HelloWorld.vue' describe('HelloWorld.vue', () => { - it('renders props.msg when passed', () => { - const msg = 'new message' - const wrapper = shallowMount(HelloWorld, { - propsData: { msg } + it('renders props.msg when passed', () => { + const msg = 'new message' + const wrapper = shallowMount(HelloWorld, { + propsData: {msg} + }) + expect(wrapper.text()).to.include(msg) }) - expect(wrapper.text()).to.include(msg) - }) }) From a86b7966f3af9fbcbfb0e4559746abe6dda01ea2 Mon Sep 17 00:00:00 2001 From: Matthias Koenig Date: Fri, 1 Nov 2019 10:59:04 +0100 Subject: [PATCH 17/19] improved error messages --- backend/pkdb_app/serializers.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/pkdb_app/serializers.py b/backend/pkdb_app/serializers.py index 17703f0e..d1baf43c 100644 --- a/backend/pkdb_app/serializers.py +++ b/backend/pkdb_app/serializers.py @@ -551,9 +551,9 @@ def to_internal_related_fields(self, data): except (ObjectDoesNotExist, MultipleObjectsReturned) as err: if err == ObjectDoesNotExist: - msg = f'group: {data.get("group")} in study: {study_sid} does not exist' + msg = f'group <{data.get("group")}> does not exist, check groups.' else: - msg = f'group: {data.get("group")} in study: {study_sid} has been defined multiple times.' + msg = f'group <{data.get("group")}> is defined multiple times.' raise serializers.ValidationError(msg) @@ -568,10 +568,10 @@ def to_internal_related_fields(self, data): ).pk except ObjectDoesNotExist: - msg = f'individual: individual <{data.get("individual")}> in study: <{study_sid}> does not exist' + msg = f'individual: individual <{data.get("individual")}> does not exist, check individuals.' raise serializers.ValidationError(msg) except MultipleObjectsReturned: - msg = f'individual: Multiple individuals with the name <{data.get("individual")}> have been declared on study.' + msg = f'individual: individual <{data.get("individual")}> is defined multiple times' raise serializers.ValidationError(msg) if "interventions" in data: @@ -590,7 +590,7 @@ def to_internal_related_fields(self, data): ).pk ) except ObjectDoesNotExist: - msg = f"intervention: <{intervention}> in study: <{study_sid}> does not exist" + msg = f"intervention <{intervention}> does not exist, check interventions." raise serializers.ValidationError(msg) data["interventions"] = interventions return data From b25ff604754b3d3863772ac9723fb8d1e42ebf5f Mon Sep 17 00:00:00 2001 From: Matthias Koenig Date: Fri, 1 Nov 2019 11:08:49 +0100 Subject: [PATCH 18/19] Fix #457, bugfix for group checking --- backend/pkdb_app/serializers.py | 34 ++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/backend/pkdb_app/serializers.py b/backend/pkdb_app/serializers.py index d1baf43c..f0e927ed 100644 --- a/backend/pkdb_app/serializers.py +++ b/backend/pkdb_app/serializers.py @@ -548,14 +548,14 @@ def to_internal_related_fields(self, data): Q(ex__groupset__study__sid=study_sid) & Q(name=data.get("group")) ).pk - - except (ObjectDoesNotExist, MultipleObjectsReturned) as err: - if err == ObjectDoesNotExist: - msg = f'group <{data.get("group")}> does not exist, check groups.' - else: - msg = f'group <{data.get("group")}> is defined multiple times.' - - raise serializers.ValidationError(msg) + except ObjectDoesNotExist: + raise serializers.ValidationError( + f'group <{data.get("group")}> does not exist, check groups.' + ) + except MultipleObjectsReturned: + raise serializers.ValidationError( + f'group <{data.get("group")}> is defined multiple times.' + ) if "individual" in data: if data["individual"]: @@ -568,14 +568,17 @@ def to_internal_related_fields(self, data): ).pk except ObjectDoesNotExist: - msg = f'individual: individual <{data.get("individual")}> does not exist, check individuals.' - raise serializers.ValidationError(msg) + raise serializers.ValidationError( + f'individual: individual <{data.get("individual")}> does ' + f'not exist, check individuals.' + ) except MultipleObjectsReturned: - msg = f'individual: individual <{data.get("individual")}> is defined multiple times' - raise serializers.ValidationError(msg) + raise serializers.ValidationError( + f'individual: individual <{data.get("individual")}> is ' + f'defined multiple times' + ) if "interventions" in data: - if data["interventions"]: interventions = [] if isinstance(data["interventions"], str): @@ -590,8 +593,9 @@ def to_internal_related_fields(self, data): ).pk ) except ObjectDoesNotExist: - msg = f"intervention <{intervention}> does not exist, check interventions." - raise serializers.ValidationError(msg) + raise serializers.ValidationError( + f"intervention <{intervention}> does not exist, check interventions." + ) data["interventions"] = interventions return data From b4ed7bad794edbeb40e62825b35762cff4de0824 Mon Sep 17 00:00:00 2001 From: Matthias Koenig Date: Fri, 1 Nov 2019 11:51:06 +0100 Subject: [PATCH 19/19] version bump for release --- backend/pkdb_app/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/pkdb_app/_version.py b/backend/pkdb_app/_version.py index 8bc6a451..db82d3a5 100644 --- a/backend/pkdb_app/_version.py +++ b/backend/pkdb_app/_version.py @@ -1,4 +1,4 @@ """ Definition of version string. """ -__version__ = "0.6.8a1" +__version__ = "0.6.9"

A detailed guideline for curation of studies is provided in - CURATION.md. + CURATION.md.