Порядок использования

Ниже приведены HTML-код и JS-код клиентского приложения, считываемые клиентским приложением данные и получаемый результат.

Для выполнения этого клиентского приложения можно скачать приложенный архив, развернуть его содержимое на любом веб-сервере и открыть в интернет-браузере полученную веб-страницу.

Ограничения

Приведенный пример служит лишь в качестве демонстрации отображения получаемых данных, он не является законченным решением реальной задачи.

В примере используются инструменты Bootstrap 4 и библиотеки на JavaScript: jQueryVueJS 2.

Используемые в примере компоненты не поддерживаются в браузерах Internet Explorer версий 10 и младше.

Внимание: В примере для получения данных используется запрос GET (без параметров) к заранее подготовленным данным.

При решении реальных задач следует использовать запросы POST с передачей параметров и организацией клиент-серверного асинхронного взаимодействия в соответствии с документацией.

Получаемый результат

HTML-код клиентского приложения

HTML  Развернуть
<div id="monitor">
  <h4 class="font-weight-normal">Монитор налогов и отчетности</h4>
  <div v-if="!status.ready" class="align-middle">
    <img width='25' height='25' :src="status.img" />&nbsp;&nbsp;{{ status.message }}
  </div>
  <div v-else>
    <table class="table table-sm table-bordered">
      <tr v-for="el in monitor.rows">
        <td class="px-2 align-middle" style="border: white solid 5px !important;">
          <h5 class="font-weight-normal text-"> {{ el.title }} </h5>
        </td>
        <td :class="el.tax.type == 'header' ? 'px-4 text-center ' : 'p-4' + ' align-top table-'+el.tax.type" style="border: white solid 5px !important; width: 45%;">
          <h5 class="font-weight-normal"> {{ el.tax.title | smile }}
            <span v-if="el.report.title && el.tax.title.indexOf('{{smile}}') + 1" class="fa-layers fa-fw">
              <i class="fas fa-circle text-warning"></i>
              <i class="far fa-smile"></i>
            </span>
          </h5>
          <p>{{ el.tax.description }}</p>
          <div v-for="link in el.tax.links">
            <a :href="'#'+link.name" data-toggle="#" :data-target="'#'+link.name" :data-date="link.settings.date" :data-inn="link.settings.organization.inn">{{ link.title }}</a>
          </div>
        </td>
        <td :class="el.report.type == 'header' ? 'px-4 text-center ' : 'p-4' + ' align-top table-'+el.report.type" style="border: white solid 5px !important; width: 45%;">
          <h5 class="font-weight-normal"> {{ el.report.title | smile }}
            <span v-if="el.report.title && el.report.title.indexOf('{{smile}}') + 1" class="fa-layers fa-fw">
              <i class="fas fa-circle text-warning"></i>
              <i class="far fa-smile"></i>
            </span>
          </h5>
          <p>{{ el.report.description }}</p>
          <div v-for="link in el.report.links">
            <a v-if="link.settings" :href="'#'+link.name" data-toggle="#" :data-target="'#'+link.name" :data-date="('date' in link.settings) ? link.settings.date : ''"
              :data-inn="link.settings.organization.inn">{{ link.title }}</a>
            <a v-else :href="'#'+link.name" data-toggle="modal" :data-target="'#'+link.name">{{ link.title }}</a>
          </div>
        </td>
      </tr>
    </table>
  </div>
</div>
<script src="./res/ex/monitor.js?_=1733243010"></script>

JavaScript-код

JavaScript  Развернуть
"use strict";

new Vue({
  el: "#monitor",
  data: {
    monitor: [],
    link: [],
    user: [],
    user_settings: [],
    status: initialStatus()
  },
  created: function created() {
    var self = this;
    getUserData(self);
    $.get("./res/ex/monitor.json", function(data) {
      self.monitor = data;
      self.link = data.link;
      self.status.ready = true;
    }).fail(function(error) {
      self.status = errorStatus(error);
    });
  },

  filters: {
    smile: function smile(text) {
      if (text) {
        text = text.replace("{{smile}}", "");
      }
      return text;
    }
  }
});

Данные, получаемые клиентским приложением

JSON  Развернуть
{
  "link": {
    "name": "goto1C",
    "type": "anchor",
    "title": "Монитор налогов и отчетности",
    "address": "e1cib/data/РегистрСведений.ПубликуемыеНавигационныеСсылки?Идентификатор=8cd2c1cd-b0fa-4cdb-98e5-55a1fd5c5a2e"
  },
  "rows": [
    {
      "item": 0,
      "title": "",
      "tax": {
        "type": "header",
        "title": "Оплата налогов"
      },
      "report": {
        "type": "header",
        "title": "Сдача отчетности"
      }
    },
    {
      "item": 1,
      "title": "УСН",
      "tax": {
        "type": "danger",
        "title": "Мы должны 23 860 руб.",
        "description": "Задолженность могла образоваться за один или несколько прошлых периодов",
        "deadline": "2024-05-02", 
        "links": [
          {
            "name": "tax_usn_calculator",
            "type": "endpoint",
            "title": "Погашение задолженности",
            "address": "hs/dt/storage/async/tax_usn_calculator",
            "settings": {
              "organization": {
                "inn": "783900281039",
                "kpp": ""
              },
              "date": "2018-03-31T23:59:59"
            }
          }
        ]
      },
      "report": {
        "type": "success",
        "title": "Отчетность сдана {{smile}}",
        "description": "Следующая декларация не позднее 30 апреля 2019 г.\n(за 2018 г.)",
        "deadline": "2019-04-30",
        "links": []
      }
    },
    {
      "item": 2,
      "title": "Взносы за себя",
      "tax": {
        "type": "warning",
        "title": "Пора оплатить 61 351,71 руб.",
        "description": "Не позднее 31 декабря 2018 г.",
        "deadline": "2018-07-01",
        "links": [
          {
            "name": "self_insurance_payments",
            "type": "endpoint",
            "title": "Оплата за 2 квартал 2018 г.",
            "address": "hs/dt/storage/async/self_insurance_payments",
            "settings": {
              "organization": {
                "inn": "783900281039",
                "kpp": ""
              },
              "date": "2018-06-30T23:59:59"
            }
          }
        ]
      },
      "report": {
        "type": "null"
      }
    }
  ]
}