templates/components/area.html.twig line 1

Open in your IDE?
  1. <div class="v-area-selector" ref="vAreaSelector">
  2.   <transition name="fade">
  3.   <article class="js-area-selector-pref" v-show="opened && !selectedArea">
  4.     <div class="responsive-container">
  5.       <header>
  6.         <div class="header_wr">
  7.           <div class="title_wr">
  8.             <a href="#" class="back" @click.stop="close"></a>
  9.             <h1 class="header_title">都道府県を選択する</h1>
  10.           </div>
  11.         </div>
  12.       </header>
  13.       <main>
  14.         <ul class="area_list">
  15. {#          <li class="location"><a href="#"><span class="icon">現在の位置から探す</span></a></li>#}
  16.           <li v-for="area in areas"><a href="#" @click.stop="selectArea(area)">[[ area.name ]]</a></li>
  17.         </ul>
  18.       </main>
  19.     </div>
  20.   </article>
  21.   </transition>
  22.   {#  --------------- 市区町村 --------------- #}
  23.   <article class="js-area-selector-city" v-show="opened && selectedArea">
  24.     <div class="responsive-container">
  25.       <header>
  26.         <div class="header_wr">
  27.           <div class="title_wr">
  28.             <a href="#" class="back" @click="backToArea"></a>
  29.             <h1 class="header_title">市区町村を選択する</h1>
  30.           </div>
  31.         </div>
  32.       </header>
  33.       <main>
  34.         <ul class="area_list" v-if="selectedArea">
  35.           <li v-for="location in selectedArea.locations"><a href="#" @click.stop="selectLocation(location)">[[ location.name ]]</a></li>
  36.         </ul>
  37.       </main>
  38.     </div>
  39.   </article>
  40. </div>
  41. <script>
  42.   $(function () {
  43.       var vAreaSelector = new Vue({
  44.           el: '.v-area-selector',
  45.           delimiters: ['[[', ']]'],
  46.           data: function () {
  47.               return {
  48.                   {# // trueならエリア選択画面を表示 #}
  49.                   opened: false,
  50.                   {# // 選択可能なarea、location #}
  51.                   areas: [],
  52.                   {# // 選択したarea #}
  53.                   selectedArea: null,
  54.                   {# // 選択したlocation #}
  55.                   selectedLocation: null,
  56.                   {# // location選択後に実行されるcallback #}
  57.                   callback: null,
  58.               };
  59.           },
  60.           created: function () {
  61.               this.refreshArea();
  62.           },
  63.           computed: {
  64.               {# // 選択エリア内のlocationを返す #}
  65.               selectedAreaLocations: function () {
  66.                   if (this.selectedArea) {
  67.                       return this.selectedArea.locations;
  68.                   }
  69.                   return [];
  70.               },
  71.           },
  72.           methods: {
  73.               open: function (callback) {
  74.                   this.opened = true;
  75.                   this.callback = callback;
  76.               },
  77.               close: function () {
  78.                   this.opened = false;
  79.               },
  80.               refreshArea: function () {
  81.                   var self = this;
  82.                   $.ajax({
  83.                       url: '{{ path('api_areas_get_collection') }}',
  84.                       headers: {
  85.                           'Accept': 'application/json',
  86.                       },
  87.                   }).done(function (data) {
  88.                       self.areas = data;
  89.                   }).fail(function () {
  90.                       alert('エリアの取得に失敗しました。ページを再読み込みしてください。');
  91.                   });
  92.               },
  93.               selectArea: function (area) {
  94.                   this.selectedArea = area;
  95.               },
  96.               selectLocation: function (location) {
  97.                   this.selectedLocation = location;
  98.                   if (typeof this.callback === 'object' || typeof this.callback === 'function') {
  99.                       this.callback(this.selectedLocation);
  100.                   }
  101.                   this.close();
  102.               },
  103.               backToArea: function () {
  104.                   this.selectedArea = null;
  105.               },
  106.           },
  107.       });
  108.       $(document).on('click', '.js-area-selector', function () {
  109.           var self = this;
  110.           {# // .js-area-selectorをクリックするとエリア選択画面を表示 #}
  111.           vAreaSelector.open(function (location) {
  112.               {# // 呼び出し元の要素にはlocationの名称を日本語で入れる #}
  113.               $(self).val(location.name);
  114.               {# // 選択したlocationのIDを入れる対象の要素をdata属性から取得したセレクタで取得 #}
  115.               var target = $(self).data('area-selector-data-target');
  116.               var $target = $(target);
  117.               {# // 選択したlocationのIDを値として入れる #}
  118.               $target.val(location.id);
  119.           });
  120.       });
  121.   });
  122. </script>