<div class="enablevue">
    <div class="enablevue"></div>
    <calendarblock v-cloak id="calendarblock" fetch-events-url="http://localhost:2000/production//KitModules/Calendar/Services/CalendarDataService.asmx/GetCalendar" event-image-height="300" event-image-width="300" event-default-city="Härnösand" event-language-id="sv-SE"
        event-month-filter-count="6" event-page-size="20" event-preview-length="200" event-calendarpage-id="12418">
        <div slot="header" class="d-flex w-100 flex-wrap">
            <h2 class="heading-level-2 mr-auto">Evenemang</h2>
            <div class="d-block d-sm-none  pb-md"></div>
            <div class="block-action d-flex align-items-center">
                <a href="#">Fler evenemang</a>
                <a id="show-modal" @click.prevent="showModal = true" href="#">Prenumerera</a>
            </div>
        </div>
    </calendarblock>

    <modal v-if="showModal" @close="showModal = false" v-cloak>
        <h3 slot="header" class="heading-level-3 mb-0">Prenumerera</h3>
        <div slot="body">
            <div class="row mb-xs">
                <div class="col-3 col-md-1">
                    <img src="/images/icon-windows.svg" alt="windows icon" class="img-fluid">
                    <div class="d-block d-sm-none  mb-xs"></div>
                </div>
                <div class="col-12  col-md-11">
                    <p>
                        Har du Outlook på datorn så räcker det med att klicka länken "Prenumerera". En ruta kommer då upp där du väljer att skicka till Outlook och trycker OK för att sedan i Outlook bekräfta att du vill prenumerera på denna kalender.
                    </p>
                    <a href="#">Aktivera prenumeration</a>
                </div>
            </div>
            <div class="row mb-xs">
                <div class="col-3 col-md-1"><img src="/images/icon-apple.svg" alt="apple icon" class="img-fluid">
                    <div class="d-block d-sm-none  mb-xs"></div>
                </div>
                <div class="col-12  col-md-11">
                    <p>
                        Har du Apple Kalender installerad så räcker det med att klicka länken "Prenumerera". En ruta kommer då upp där du blir tillfrågad om du tillåter prenumeration. Sedan klickar på prenumerera.
                    </p>
                    <a href="#">Aktivera prenumeration</a>
                </div>
            </div>
            <div class="row mb-xs">
                <div class="col-3 col-md-1"><img src="/images/icon-android.svg" alt="android icon" class="img-fluid">
                    <div class="d-block d-sm-none  mb-xs"></div>
                </div>
                <div class="col-12  col-md-11">
                    <p>
                        Har du Outlook på datorn så räcker det med att klicka länken "Prenumerera". En ruta kommer då upp där du väljer att skicka till Outlook och trycker OK för att sedan i Outlook bekräfta att du vill prenumerera på denna kalender.
                    </p>
                    <a href="#">Aktivera prenumeration</a>
                    <div class="d-block d-sm-none  mb-md"></div>
                </div>
            </div>
        </div>
    </modal>
</div>
<div class="enablevue">
    <div class="enablevue"></div>
    <calendarblock v-cloak id="calendarblock" fetch-events-url="{{eventSettings.urlToService}}"
        event-image-height="{{eventSettings.ImageHeight}}" event-image-width="{{eventSettings.ImageWidth}}"
        event-default-city="{{eventSettings.DefaultCity}}" event-language-id="{{eventSettings.LanguageId}}"
        event-month-filter-count="{{eventSettings.MonthFilterCount}}" event-page-size="{{eventSettings.PageSize}}"
        event-preview-length="{{eventSettings.PreviewLength}}" event-calendarpage-id="{{eventSettings.CalendarPageId}}">
        <div slot="header" class="d-flex w-100 flex-wrap">
            <h2 class="heading-level-2 mr-auto">{{title.value}}</h2>
            <div class="d-block d-sm-none  pb-md"></div>
            <div class="block-action d-flex align-items-center">
                <a href="{{{linkTextEvents.url}}}">{{linkTextEvents.value}}</a>
                <a id="show-modal" @click.prevent="showModal = true" href="#">{{linkTextSubscribe.value}}</a>
            </div>
        </div>
    </calendarblock>


    <modal v-if="showModal" @close="showModal = false" v-cloak>
        <h3 slot="header" class="heading-level-3 mb-0">{{modalSettings.title}}</h3>
        <div slot="body">
            <div class="row mb-xs">
                <div class="col-3 col-md-1">
                    <img src="{{modalSettings.windows.iconUrl}}" alt="windows icon" class="img-fluid">
                    <div class="d-block d-sm-none  mb-xs"></div>
                </div>
                <div class="col-12  col-md-11">
                    <p>
                        {{{modalSettings.windows.text}}}
                    </p>
                    <a href="{{modalSettings.windows.urlToService}}">{{modalSettings.windows.urlText}}</a>
                </div>
            </div>
            <div class="row mb-xs">
                <div class="col-3 col-md-1"><img src="{{modalSettings.apple.iconUrl}}" alt="apple icon" class="img-fluid">
                    <div class="d-block d-sm-none  mb-xs"></div>
                </div>
                <div class="col-12  col-md-11">
                    <p>
                        {{{modalSettings.apple.text}}}
                    </p>
                    <a href="{{modalSettings.apple.urlToService}}">{{modalSettings.apple.urlText}}</a>
                </div>
            </div>
            <div class="row mb-xs">
                <div class="col-3 col-md-1"><img src="{{modalSettings.android.iconUrl}}" alt="android icon"
                        class="img-fluid">
                    <div class="d-block d-sm-none  mb-xs"></div>
                </div>
                <div class="col-12  col-md-11">
                    <p>
                        {{{modalSettings.android.text}}}
                    </p>
                    <a href="{{modalSettings.android.urlToService}}">{{modalSettings.android.urlText}}</a>
                    <div class="d-block d-sm-none  mb-md"></div>
                </div>
            </div>
        </div>
    </modal>
</div>
{
  "epiDivClass": "col-md-12",
  "title": {
    "value": "Evenemang",
    "epiEditAttribute": ""
  },
  "linkTextEvents": {
    "value": "Fler evenemang",
    "url": "#"
  },
  "linkTextSubscribe": {
    "value": "Prenumerera"
  },
  "eventSettings": {
    "urlToService": "http://localhost:2000/production//KitModules/Calendar/Services/CalendarDataService.asmx/GetCalendar",
    "ImageHeight": 300,
    "ImageWidth": 300,
    "DefaultCity": "Härnösand",
    "LanguageId": "sv-SE",
    "MonthFilterCount": 6,
    "NewsPageId": 122674,
    "PageSize": 20,
    "PreviewLength": 200,
    "City": "Härnösand",
    "CalendarPageId": 12418
  },
  "modalSettings": {
    "title": "Prenumerera",
    "windows": {
      "iconUrl": "/images/icon-windows.svg",
      "text": "Har du Outlook på datorn så räcker det med att klicka länken \"Prenumerera\". En ruta kommer då upp där du väljer att skicka till Outlook och trycker OK för att sedan i Outlook bekräfta att du vill prenumerera på denna kalender.",
      "urlToService": "#",
      "urlText": "Aktivera prenumeration"
    },
    "apple": {
      "iconUrl": "/images/icon-apple.svg",
      "text": "Har du Apple Kalender installerad så räcker det med att klicka länken \"Prenumerera\". En ruta kommer då upp där du blir tillfrågad om du tillåter prenumeration. Sedan klickar på prenumerera.",
      "urlToService": "#",
      "urlText": "Aktivera prenumeration"
    },
    "android": {
      "iconUrl": "/images/icon-android.svg",
      "text": "Har du Outlook på datorn så räcker det med att klicka länken \"Prenumerera\". En ruta kommer då upp där du väljer att skicka till Outlook och trycker OK för att sedan i Outlook bekräfta att du vill prenumerera på denna kalender.",
      "urlToService": "#",
      "urlText": "Aktivera prenumeration"
    }
  }
}
  • Content:
    Vue.component("modal", {
      data() {
        return {
          show: false
        };
      },
      template: `
      <transition name="modal" mode="out-in">
      <div class="modal-mask" >
        <div class="modal-wrapper" @click="$emit('close')">
          <div class="modal-container" @click.stop>
    
            <div class="modal-header d-flex flex-row align-items-center">
              <div class="d-flex align-items-center">
                <slot name="header">
                </slot>
              </div>
              <div class="ml-auto">
                <button @click="$emit('close')" class="button-close d-flex align-items-center">
                    <i class="material-icons">clear</i>
                </button>
              </div>
            </div>
    
            <div class="modal-body">
              <slot name="body">
              </slot>
            </div>
    
            
          </div>
        </div>
      </div>
    </transition>
      `
    });
    
    Vue.component("calendarblock", {
      template: `
      <div  class="calendar-block " v-cloak >
      <div class="block-header" >
        <slot name="header">
      </slot>
      </div>
      <div class="row">
          <div class="col-12" v-for="(item, index) in items" :key="index" v-if="!loading && index <= 8">
              <article role="article">
                  <a href="#" class="d-flex" v-bind:class="{'article--image': item.ImageData}"
                      v-bind:style="{ backgroundImage: 'url(' + item.ImageData + ')' }">
                      <div class="caption mt-auto" v-if="!item.CalendarPageId">
                          Nyhet
                      </div>
                      <div class="caption mt-auto" v-else>
                          \{{item.EventStartDate}}
                      </div>
                  </a>
                  <h2 class="heading-level-3"><a :href="item.Url">\{{item.Title}}</a></h2>
                  <p v-if="item.Intro">\{{item.Intro}}</p>
                  <div class="d-flex flex-row" v-if="item.CalendarPageId">
                      <p class="small-font">\{{item.EventStartDate}}, kl. \{{item.StartTime}}-\{{item.StopTime}}
                          <br>\{{item.City}}, \{{item.Location}}</p>
    
                  </div>
                  <div v-else class="d-flex flex-row">
                      <p class="small-font">\{{item.PublishedDate}}</p>
                  </div>
              </article>
          </div>
          <div class="col-12" v-for="i in 6" :key="i" v-if="loading">
              <article class="fake--article ">
                  <div class="fake--image loading"></div>
                  <div class="fake--title loading mt-xs mb-xs"></div>
                  <div class="fake--text  mb-xs">
                      <div class="loading"></div>
                      <div class="loading"></div>
                      <div class="loading"></div>
                  </div>
              </article>
          </div>
      </div>
    
    </div>
      `,
      data() {
        return {
          url: "",
          loading: false,
          items: [],
          events: [],
          showModal: false,
          news: [],
          eventRequest: {
            request: {
              Settings: {
                IsInit: true,
                PageIndex: 0
              }
            }
          }
        };
      },
      mounted() {
        if (document.getElementById("calendarblock")) {
          this.waitForUrlBeforeFetch();
        }
      },
      methods: {
        isLoading(bool) {
          this.loading = bool;
        },
        fetchMore() {
          if (this.eventRequest.request.Settings.PageIndex < this.items.PageCount) {
            this.eventRequest.request.Settings.PageIndex += 1;
            this.fetchData(this.url, this.eventRequest);
          } else {
            this.error = true;
            this.errorText = "Det finns inga fler evenemang.";
          }
        },
        async waitForUrlBeforeFetch() {
          if (document.getElementById("calendarblock")) {
            this.isLoading(true);
            let page = document.getElementById("calendarblock");
            if (page) {
              //Get Event Props
              let eventsUrl = page.getAttribute("fetch-events-url");
              let eventProps = {
                ImageHeight: page.getAttribute("event-image-height"),
                ImageWidth: page.getAttribute("event-image-width"),
                City: page.getAttribute("event-default-city"),
                LanguageId: page.getAttribute("event-language-id"),
                MonthFilterCount: page.getAttribute("event-month-filter-count"),
                PageSize: page.getAttribute("event-page-size"),
                PreviewLength: page.getAttribute("event-preview-length"),
                CalendarPageId: page.getAttribute("event-calendarpage-id")
              };
    
              if (eventProps) {
                this.eventRequest.request.Settings = {
                  ...this.eventRequest.request.Settings,
                  ...eventProps
                };
                await this.fetchEvents(eventsUrl, this.eventRequest);
    
                this.formatDateAndFilterByDate(this.events);
              }
            }
          }
        },
        async formatDateAndFilterByDate(arr) {
          if (arr) {
            try {
              arr.forEach(element => {
                if (element.CalendarPageId) {
                  let momentDate = element.EventStartDate.slice(6, -2);
                  let converMomentToDate = new Date(parseInt(momentDate, 10));
                  let newMomentDate = moment(converMomentToDate)
                    .locale("sv")
                    .format("LL");
                  element.EventStartDate = newMomentDate;
    
                  let momentDate1 = element.ChangedDate.slice(6, -2);
                  let converMomentToDate1 = new Date(parseInt(momentDate1, 10));
                  let newMomentDate1 = moment(converMomentToDate1)
                    .locale("sv")
                    .format("LL");
                  element.ChangedDate = newMomentDate1;
                  element.date = converMomentToDate1;
                  console.log(element);
                }
              });
              let data = arr;
              console.log({ "before sort": data });
              data.sort(
                (a, b) => new Date(a.EventStartDate) - new Date(b.EventStartDate)
              );
              console.log({ "after sort": data });
              this.items = data;
              this.isLoading(false);
            } catch (error) {
              this.isLoading(false);
            }
          }
        },
        async fetchEvents(url, req) {
          try {
            let response = await fetch(url, {
              method: "post",
              headers: {
                Accept: "application/json",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(req)
            });
            let data = await response.json();
            if (data.d) {
              console.log({ "data d": data.d });
              this.events = data.d.Events;
            } else {
              this.events = data.Events;
            }
          } catch (error) {
            this.isLoading(false);
          }
        }
      }
    });
    
  • URL: /components/raw/calendarblock/CalendarBlock.js
  • Filesystem Path: src\components\02-block_components\CalendarBlock\CalendarBlock.js
  • Size: 6.8 KB
  • Content:
    .calendar-block {
      article {
        &.fake--article {
          .fake--image {
            width: 100%;
            height: 303px;
          }
          .fake--title {
            width: 75%;
            height: 20px;
          }
          .fake--text {
            div {
              width: 75%;
              height: 10px;
              margin-bottom: 10px;
              &:nth-child(2) {
                width: 55%;
              }
              &:nth-child(3) {
                width: 35%;
              }
            }
          }
        }
        //margin-bottom: $md-space;
        margin-bottom: 50px;
        .article--image {
          margin-bottom: $xs-space;
          background-position: center;
          background-repeat: no-repeat;
          background-size: cover;
          height: 303px;
          width: 100%;
          &:hover {
            .caption {
              text-decoration: none;
            }
          }
          .caption {
            font-size: 16px;
            margin-bottom: 0px;
          }
        }
      }
      .loading-container {
        height: 100px;
        padding: 10px;
      }
      .loading {
        animation-duration: 1s;
        animation-fill-mode: forwards;
        animation-iteration-count: infinite;
        animation-name: wave;
        animation-timing-function: linear;
        -webkit-animation-duration: 1s;
        -webkit-animation-fill-mode: forwards;
        -webkit-animation-iteration-count: infinite;
        -webkit-animation-name: wave;
        -webkit-animation-timing-function: linear;
        -moz-animation-duration: 1s;
        -moz-animation-fill-mode: forwards;
        -moz-animation-iteration-count: infinite;
        -moz-animation-name: wave;
        -moz-animation-timing-function: linear;
        background: $bg-grey;
        background-image: -webkit-gradient(
          linear,
          left center,
          right center,
          from($bg-grey),
          color-stop(0.2, #fff),
          color-stop(0.4, #fff),
          to($bg-grey)
        );
        background-image: -webkit-linear-gradient(
          left,
          $bg-grey 0%,
          #fff 20%,
          #fff 40%,
          $bg-grey 100%
        );
        background-image: -moz-gradient(
          linear,
          left center,
          right center,
          from($bg-grey),
          color-stop(0.2, #fff),
          color-stop(0.4, #fff),
          to($bg-grey)
        );
        background-image: -moz-linear-gradient(
          left,
          $bg-grey 0%,
          #fff 20%,
          #fff 40%,
          $bg-grey 100%
        );
        background-repeat: no-repeat;
        background-size: cover;
        height: 104px;
        position: relative;
      }
      .reverse-direction .loading {
        -webkit-animation-direction: reverse;
        -moz-animation-direction: reverse;
      }
    
      @-webkit-keyframes wave {
        0% {
          background-position: -468px 0;
        }
        100% {
          background-position: 468px 0;
        }
      }
      @-moz-keyframes wave {
        0% {
          background-position: -468px 0;
        }
        100% {
          background-position: 468px 0;
        }
      }
    }
    
    @element .calendar-block and (max-width: 399px) {
      :self article .article--image {
          height: 200px;
      }
    }
    
    @element .calendar-block and (min-width: 400px) {
      :self article .article--image {
          height: 250px;
      }
    }
    
    @element .calendar-block and (min-width: 600px) {
      :self article .article--image {
          height: 300px;
      }
    }
    
    @element .calendar-block and (min-width: 900px) {
      :self article .article--image {
          height: 600px;
      }
    }
    
    .modal-mask {
      position: fixed;
      z-index: 9998;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.5);
      display: table;
      transition: opacity 0.3s ease;
    }
    
    .modal-wrapper {
      display: table-cell;
      vertical-align: middle;
    }
    .modal-container {
      width: 50%;
      margin: 0px auto;
      padding: 10px 20px;
      background-color: #fff;
      border-radius: 2px;
      box-shadow: $box-shadow;
      transition: all 0.2s ease;
      @include media-breakpoint-down(xs) {
        width: 100%;
        padding: 0px;
        border-radius: 0px;
      }
      @include media-breakpoint-down(sm) {
        width: 100%;
        padding: 0px;
        border-radius: 0px;
      }
      @include media-breakpoint-up(md) {
        width: 75%;
      }
      @include media-breakpoint-up(lg) {
        width: 50%;
      }
    }
    .modal-header h3 {
      margin-top: 0;
    }
    .modal-body {
      padding: $xs-space $xs-space;
      transition: all 0.3s ease;
      @include media-breakpoint-down(xs) {
        overflow-y: scroll;
        -webkit-overflow-scrolling: auto;
        height: 100vh;
    
        padding: $xs-space $xs-space $md-space $xs-space;
      }
      @include media-breakpoint-down(sm) {
        overflow-y: scroll;
        -webkit-overflow-scrolling: auto;
        height: 100vh;
        padding: $xs-space $xs-space $md-space $xs-space;
      }
    }
    .modal-default-button {
      float: right;
    }
    .modal-enter {
      opacity: 1;
    }
    .modal-leave-active {
      opacity: 0;
    }
    .modal-enter .modal-container,
    .modal-leave-active .modal-container {
      -webkit-transform: scale(0.9);
      transform: scale(0.9);
    }
    
  • URL: /components/raw/calendarblock/CalendarBlock.scss
  • Filesystem Path: src\components\02-block_components\CalendarBlock\CalendarBlock.scss
  • Size: 4.9 KB

There are no notes for this item.