Merge pull request #460 from shikorism/replace-jquery-tissue-plugin

Replace jquery tissue plugin
This commit is contained in:
shibafu 2020-08-08 16:41:48 +09:00 committed by GitHub
commit e6950a5dfb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 85 additions and 102 deletions

View File

@ -1,12 +0,0 @@
// tissue.ts で定義されているjQuery Pluginの型定義
declare namespace JQueryTissue {
interface LinkCardOptions {
endpoint: string;
}
}
interface JQuery<TElement = HTMLElement> {
linkCard: (options?: JQueryTissue.LinkCardOptions) => this;
pageSelector: () => this;
deleteCheckinModal: () => this;
}

View File

@ -1,5 +1,6 @@
import * as Cookies from 'js-cookie'; import * as Cookies from 'js-cookie';
import { fetchPostJson, fetchDeleteJson, ResponseError } from './fetch'; import { fetchPostJson, fetchDeleteJson, ResponseError } from './fetch';
import { linkCard, pageSelector, deleteCheckinModal } from './tissue';
require('./bootstrap'); require('./bootstrap');
@ -20,14 +21,18 @@ $(() => {
} }
$('[data-toggle="tooltip"]').tooltip(); $('[data-toggle="tooltip"]').tooltip();
$('.alert').alert(); $('.alert').alert();
$('.tis-page-selector').pageSelector(); document.querySelectorAll('.tis-page-selector').forEach(pageSelector);
$('.link-card').linkCard(); document.querySelectorAll('.link-card').forEach(linkCard);
const $deleteCheckinModal = $('#deleteCheckinModal').deleteCheckinModal();
$(document).on('click', '[data-target="#deleteCheckinModal"]', function (event) { const elDeleteCheckinModal = document.getElementById('deleteCheckinModal');
event.preventDefault(); if (elDeleteCheckinModal) {
$deleteCheckinModal.modal('show', this); const $deleteCheckinModal = deleteCheckinModal(elDeleteCheckinModal);
}); $(document).on('click', '[data-target="#deleteCheckinModal"]', function (event) {
event.preventDefault();
$deleteCheckinModal.modal('show', this);
});
}
$(document).on('click', '[data-href]', function (_event) { $(document).on('click', '[data-href]', function (_event) {
location.href = $(this).data('href'); location.href = $(this).data('href');

View File

@ -1,5 +1,2 @@
// jQuery
import './tissue';
// Bootstrap // Bootstrap
import 'bootstrap'; import 'bootstrap';

View File

@ -1,80 +1,73 @@
import { fetchGet } from './fetch'; import { fetchGet } from './fetch';
(function ($) { export function suicide<T>(e: T) {
$.fn.linkCard = function (options) { return function (): never {
const settings = $.extend( throw e;
{ };
endpoint: '/api/checkin/card', }
},
options
);
return this.each(function () { const die = suicide('Element not found!');
const $this = $(this);
const url = $this.find('a').attr('href'); export function linkCard(el: Element) {
if (!url) { const url = el.querySelector('a')?.href;
return; if (!url) {
return;
}
fetchGet('/api/checkin/card', { url })
.then((response) => response.json())
.then((data) => {
const metaColumn = el.querySelector('.col-12:last-of-type') || die();
const imageColumn = el.querySelector<HTMLElement>('.col-12:first-of-type') || die();
const title = el.querySelector<HTMLElement>('.card-title') || die();
const desc = el.querySelector<HTMLElement>('.card-text') || die();
const image = imageColumn.querySelector('img') || die();
if (data.title === '') {
title.style.display = 'none';
} else {
title.textContent = data.title;
} }
fetchGet(settings.endpoint, { url }) if (data.description === '') {
.then((response) => response.json()) desc.style.display = 'none';
.then((data) => { } else {
const $metaColumn = $this.find('.col-12:last-of-type'); desc.textContent = data.description;
const $imageColumn = $this.find('.col-12:first-of-type'); }
const $title = $this.find('.card-title');
const $desc = $this.find('.card-text');
const $image = $imageColumn.find('img');
if (data.title === '') { if (data.image === '') {
$title.hide(); imageColumn.style.display = 'none';
} else { metaColumn.classList.remove('col-md-6');
$title.text(data.title); } else {
} image.src = data.image;
}
if (data.description === '') { if (data.title !== '' || data.description !== '' || data.image !== '') {
$desc.hide(); el.classList.remove('d-none');
} else { }
$desc.text(data.description);
}
if (data.image === '') {
$imageColumn.hide();
$metaColumn.removeClass('col-md-6');
} else {
$image.attr('src', data.image);
}
if (data.title !== '' || data.description !== '' || data.image !== '') {
$this.removeClass('d-none');
}
});
}); });
};
$.fn.pageSelector = function () { return el;
return this.on('change', function () { }
location.href = $(this).find(':selected').data('href');
});
};
$.fn.deleteCheckinModal = function () { export function pageSelector(el: Element) {
return this.each(function () { if (el instanceof HTMLSelectElement) {
$(this) el.addEventListener('change', function () {
.on('show.bs.modal', function (event) { location.href = this.options[this.selectedIndex].dataset.href as string;
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const target = $(event.relatedTarget!);
const modal = $(this);
modal.find('.modal-body .date-label').text(target.data('date'));
modal.data('id', target.data('id'));
})
.find('.btn-danger')
.on('click', function (_event) {
const modal = $('#deleteCheckinModal');
const form = modal.find('form');
form.attr('action', form.attr('action')?.replace('@', modal.data('id')) || null);
form.submit();
});
}); });
}; }
})(jQuery); return el;
}
export function deleteCheckinModal(modal: Element) {
let id: any = null;
modal.querySelector('form')?.addEventListener('submit', function () {
this.action = this.action.replace('@', id);
});
return $(modal).on('show.bs.modal', function (event) {
const target = event.relatedTarget || die();
const dateLabel = this.querySelector('.modal-body .date-label') || die();
dateLabel.textContent = target.dataset.date || null;
id = target.dataset.id;
});
}

View File

@ -97,13 +97,13 @@
削除確認 削除確認
@endslot @endslot
<span class="date-label"></span> のチェックインを削除してもよろしいですか? <span class="date-label"></span> のチェックインを削除してもよろしいですか?
<form action="{{ route('checkin.destroy', ['id' => '@']) }}" method="post">
{{ csrf_field() }}
{{ method_field('DELETE') }}
</form>
@slot('footer') @slot('footer')
<button type="button" class="btn btn-secondary" data-dismiss="modal">キャンセル</button> <form action="{{ route('checkin.destroy', ['id' => '@']) }}" method="post">
<button type="button" class="btn btn-danger">削除</button> {{ csrf_field() }}
{{ method_field('DELETE') }}
<button type="button" class="btn btn-secondary" data-dismiss="modal">キャンセル</button>
<button type="submit" class="btn btn-danger">削除</button>
</form>
@endslot @endslot
@endcomponent @endcomponent
@endsection @endsection

View File

@ -117,13 +117,13 @@
削除確認 削除確認
@endslot @endslot
<span class="date-label"></span> のチェックインを削除してもよろしいですか? <span class="date-label"></span> のチェックインを削除してもよろしいですか?
<form action="{{ route('checkin.destroy', ['id' => '@']) }}" method="post">
{{ csrf_field() }}
{{ method_field('DELETE') }}
</form>
@slot('footer') @slot('footer')
<button type="button" class="btn btn-secondary" data-dismiss="modal">キャンセル</button> <form action="{{ route('checkin.destroy', ['id' => '@']) }}" method="post">
<button type="button" class="btn btn-danger">削除</button> {{ csrf_field() }}
{{ method_field('DELETE') }}
<button type="button" class="btn btn-secondary" data-dismiss="modal">キャンセル</button>
<button type="submit" class="btn btn-danger">削除</button>
</form>
@endslot @endslot
@endcomponent @endcomponent
@endsection @endsection