/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

@import "variables";

.data-table {
  width: 100%;
}

.resources-wrapper{
  height: calc(100vh - 105px);
  overflow: hidden;
  margin:  -15px;
  padding: 15px;
  .table-wrapper{
    overflow: auto;
    height: calc(100vh - 115px);
    margin:  0 -15px -15px -15px;
    padding: 0 15px 15px 15px;
  }
}

table.resources {
  width: 100%;
  max-height: 100%;

  .header-row {
    position: sticky;
    background-clip:padding-box;
    z-index: 1;
    th {
      padding: 5px;
      padding-left: 20px;

      .mat-icon-button{
        line-height: 45px;
      }
    }

    .label {
      display: inline-block;
      padding-top: 14px;
      vertical-align: super !important;
      font-size: 13px;
    }
  }

  .filter-field{
    font-size: 13px;
    padding-left: 10px;
  }

  .exploratory {
    padding: 0;

    .element-row {
      display: flex;
      min-height: 48px;
      height: initial;

      td {
        padding: 5px;
        padding-left: 20px;
        display: flex;
        align-items: center;

        &.name-col {
          padding-left: 21px;
          overflow: hidden;
          span{
            cursor: pointer;
          }
        }

        &.shape-col{
          align-items: start;
          flex-direction: column;
          justify-content: center;
        }

        &.resources-col {
          overflow: hidden;
        }
      }
    }

    tr:not(:last-child) {
      border-bottom: 1px solid #d9d9d9;
    }
  }

  .element-row {
    td {
      border-bottom-width: 0;
    }
  }

  .filter-row {
    background-clip:padding-box;

    th {
      padding: 5px;
      background-clip: padding-box;


      &:last-child {
        padding-right: 6px;
      }
    }
  }

  .name-col {
    width: 17%;
    padding-right: 5px;
    padding-left: 24px;
    background-color: inherit;
  }

  .project-name{
    font-weight: 600;
    color: #577289;
    padding-left: 21px;
  }


  .status-col {
    width: 11%;
  }

  .shape-col{
    width: 13%;
    color: #577289;
    .label{
      color: $table-header-color;
    }
  }

  .tag-col {
    width: 13%;

    mat-chip {
      min-height: 20px;
      padding: 5px 10px;
      font-size: 13px;
      max-width: 110px !important;
      white-space: nowrap;
      display: inline-block;
      line-height: 10px;
      margin: 2px;
    }
  }

  .resources-col {
    width: 28%;
  }

  .cost-col {
    width: 12%;
    justify-content: space-between;
  }

  .label-header{
    &.cost-col{
      z-index: 6 !important;
    }

    &.status-col{
      z-index: 10 !important;
    }

    &.resources-col {
      z-index: 7 !important;
    }

    &.tag-col {
      z-index: 8 !important;
    }

    &.shape-col {
      z-index: 9 !important;
    }

    &.settings {
      z-index: 5 !important;
    }
  }

  .actions-col {
    padding-right: 24px;
    text-align: right;
    background-color: inherit;
    z-index: 5 !important;
    .label{
      padding-right: 5px;
    }
  }
  tr.detail-row {
    height: 0;
  }
  
  .element-diagram {
    min-width: 80px;
    border: 2px solid black;
    padding: 8px;
    font-weight: lighter;
    margin: 8px 0;
    height: 104px;
  }

  .element-symbol {
    font-weight: bold;
    font-size: 40px;
    line-height: normal;
  }

  .element-description {
    padding: 16px;
  }

  .element-description-attribution {
    opacity: 0.5;
  }



  .dashboard_table {
    width: 100%;
    table-layout: fixed;
  }



  .dashboard_table tr {
    vertical-align: top;
  }

  .dashboard_table tr th span {
    width: 50px;
    text-align: center;
    height: 100%;
    line-height: 40px;
  }

  .dashboard_table tr td {
    font-size: 13px;
    padding: 20px 15px 16px;
  }

  .dashboard_table tr td,
  .dashboard_table tr th {
    border: 1px solid #d5dfea;
    text-align: left;
  }

  .dashboard_table tr td:last-child {
    text-align: center;
  }

  .dashboard_table_body td:first-child {
    background: #f3fbfd;
    color: #455c74;
    font-weight: 600;
    font-size: 16px;
    cursor: pointer;
    overflow: hidden;
    text-overflow: ellipsis;
    &::after{
      content: '';
      display: block;
    }
  }

  .dashboard_table tr:nth-child(2n + 1) {
    background: #f9fafb;
  }

  .dashboard_table tr.filter-row td {
    padding: 10px;
  }

  .dashboard_table tr.filter-row td:first-child {
    font-weight: 400;
  }

  .dashboard_table tr.filter-row td:last-child {
    padding: 10px 0;
  }

  .dashboard_table tr:nth-child(2n + 1) td:first-child {
    background: #edf6f9;
  }

  .dashboard_table th {
    background: #a1b7d1;
    color: #fff;
    font-weight: 600;
    line-height: 40px;
    text-transform: uppercase;
    padding-left: 12px;
    font-size: 13px;
  }
  
  &.data-grid .status-col .status {
    text-transform: capitalize;
  }

  .message_block td {
    text-align: left !important;
  }

  &.data-grid .total_cost {
    float: left;
    display: inline-block;
    color: #455c74;
  }

  .currency_details {
    display: flex;
    color: #35afd5;
    cursor: pointer;
    transition: all 0.45s ease-in-out;
    padding-left: 10px;
  }

  .currency_details:hover {
    color: #3392b0;
  }

  .currency_details .material-icons {
    font-size: 18px;
  }

  .mat-icon-button .mat-icon,
  .mat-icon-button i {
    line-height: 42px;
    font-size: 18px;
  }

  .info {
    padding: 40px;
    text-align: center;
  }

  .content-row{
    background-clip: padding-box;
  }

  .not-allow{
    cursor: not-allowed !important;
  }
}

.data-grid .list-menu {
  left: auto;
  margin-left: 0;
  right: 15px;
  padding: 10px 15px;
  box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
  0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);
  border: none;
  min-width: 190px;
  max-height: calc(100vh / 2 - 70px);
}

.settings:not(.label-header) {
  position: relative;
  text-align: right;
  width: 6%;
  padding-right: 15px !important;
  justify-content: flex-end;

  .actions {
    background-image: url(../../../assets/svg/settings_icon.svg);
    width: 16px;
    height: 16px;
    display: inline-block;
    text-align: center;
    cursor: pointer;
  }

  .disabled {
    opacity: 0.4;
    cursor: not-allowed;
    pointer-events: none;
  }
}


.data-grid .list-menu li {
  font-size: 13px;
  border-bottom: 1px solid #edf1f5;
  padding-bottom: 5px;
  cursor: pointer;
  margin: 5px -5px;
  color: #577289;
  transition: all 0.45s ease-in-out;
  div{
    padding: 8px 15px;
  }
}

.data-grid .list-menu a.navigate {
  text-decoration: none;
  color: #577289;
  transition: all 0.45s ease-in-out;
}

.data-grid .list-menu li i {
  font-size: 18px;
  padding-right: 5px;
  vertical-align: bottom;
}

.data-grid .list-menu li:not(.not-allow):hover,
.data-grid .list-menu li:not(.not-allow):hover a {
  background: none !important;
  color: #36afd5;
}

.data-grid .list-menu li:last-child {
  border-bottom: 0;
}

.data-grid .list-menu ul {
  margin-bottom: 0;
}

.data-grid .list-menu .active-items li {
  border-bottom: 1px solid #edf1f5;
}

.data-grid .message_block {
  background: #edf6f9;
}

@media screen and (max-width: 1400px) {
  table.resources {
    .settings {
      width: 7%;
    }
  }
}



.info {
  padding: 40px;
  text-align: center;
}

.odahu-icon{
  vertical-align: middle;
  margin-left: 10px;
}

.content-row{
  background-clip: padding-box;
}
