From a1f7147bd1e7d8bde280caf57a75d3ccf18a51d6 Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Tue, 14 May 2019 10:24:37 +0700 Subject: [PATCH 01/11] Created static view sample --- public/css/main.css | 23 ++ public/js/app.js | 97 ++++++- resources/js/app.js | 277 +------------------ resources/js/components/ExampleComponent.vue | 23 -- resources/js/components/SKHasilBelajar.js | 232 ++++++++++++++++ resources/js/components/SuratKelulusan.js | 276 ++++++++++++++++++ resources/sass/main.scss | 24 ++ 7 files changed, 654 insertions(+), 298 deletions(-) delete mode 100644 resources/js/components/ExampleComponent.vue create mode 100644 resources/js/components/SKHasilBelajar.js create mode 100644 resources/js/components/SuratKelulusan.js diff --git a/public/css/main.css b/public/css/main.css index 3c5d85d..95dc34d 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -7641,6 +7641,21 @@ span.error { font-style: italic; } +.letter table.nilai th, .letter table.nilai td { + border-width: 1px; + border-color: #000; + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.letter table.nilai .long { + display: none; +} + +.letter table.nilai .short { + display: table-cell; +} + .letter table.signature { width: auto; margin-left: auto; @@ -7752,6 +7767,14 @@ span.error { .letter .print-button { display: initial; } + + .letter table.nilai .long { + display: table-cell; + } + + .letter table.nilai .short { + display: none; + } } @media print { diff --git a/public/js/app.js b/public/js/app.js index 3ba6453..312dc35 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -2361,18 +2361,106 @@ module.exports = function(module) { /*! no exports provided */ /***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var mithril__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mithril */ "./node_modules/mithril/mithril.mjs"); +/* harmony import */ var _components_SuratKelulusan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/SuratKelulusan */ "./resources/js/components/SuratKelulusan.js"); +/* harmony import */ var _components_SKHasilBelajar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/SKHasilBelajar */ "./resources/js/components/SKHasilBelajar.js"); + + + +mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.prefix('#'); +mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route(document.body.querySelector('.container'), '/', { + '/': _components_SuratKelulusan__WEBPACK_IMPORTED_MODULE_1__["default"], + '/hasil-belajar': _components_SKHasilBelajar__WEBPACK_IMPORTED_MODULE_2__["default"] +}); + +/***/ }), + +/***/ "./resources/js/components/SKHasilBelajar.js": +/*!***************************************************!*\ + !*** ./resources/js/components/SKHasilBelajar.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var mithril__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mithril */ "./node_modules/mithril/mithril.mjs"); + +var component = { + view: function view() { + return [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.italic.text-xs', ['Saat ini sudah ', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong', [//AccessLog.current.accessed, + ' / ']), ' siswa yang telah melihat pengumuman kelulusan.']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('form.form', { + onsubmit: function onsubmit(e) { + e.preventDefault(); //Siswa.cariData({ + //nisn: e.target.elements.nisn.value, + //tanggalLahir: e.target.elements.tanggalLahir.value, + //}); + } + }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [//!_isEmpty(Siswa.error) ? + //Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') + //: Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') + //: '' : '', + 'Nomor Induk Siswa Nasional.'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [//!_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', + 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), //m(!_isEmpty(Siswa.current) ? '.letter' : '.letter.hidden', [ + Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { + onclick: function onclick() { + window.print(); + } + }, [mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust('⎙'), ' Print']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('img[src=img/letter-head.jpg]')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('', { + style: { + height: '1px', + width: '100%', + backgroundColor: '#000', + marginTop: '.5rem' + } + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('', { + style: { + height: '3px', + width: '100%' + } + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('', { + style: { + height: '3px', + width: '100%', + backgroundColor: '#000', + marginBottom: '1rem' + } + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__body', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong.letter__body-header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('u', 'SURAT KETERANGAN')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.font-normal', 'Nomor: 077/SMK-BA/V/2019')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('br'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Yang bertanda tangan di bawah ini :')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Drs. Engkos Kosasih, M.M.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Jabatan'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Kepala Sekolah')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Asal Sekolah'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'SMK Bhakti Anindya')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Menerangkan bahwa')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'A\'AN SAPUTRA')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tempat / Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'SAMARINDA'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', ', 22 JANUARI 2001')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'NIS / NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '1166189'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', '/ 0013312008')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nomor Peserta'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', '4-19-30-02-059-001-8')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kelas'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'XII TKJ 1')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Bidang Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Teknologi Informasi dan Komunikasi')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Program Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Teknik Komputer dan Informatika')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kompetensi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Teknik Komputer dan Jaringan')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Adalah benar siswa SMK Bhakti Anindya, Kota Tangerang dan pada tanggal 13 Mei 2019 telah dinyatakan lulus')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Berikut hasil belajar siswa tersebut :')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table.nilai', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', { + style: { + width: '5%' + } + }, 'No.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=2]', 'Mata Pelajaran'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Rata-rata Raport Semester 1-6'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'Raport'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Ujian Sekolah Berstandar Nasional'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'USBN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Ujian Nasional Berbasis Komputer'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'UNBK')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Normatif')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right', '1.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', 'Pendidikan Agama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=3]', 'Rata-rata'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx')])]))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Demikian Surat Keterangan ini dibuat untuk siswa yang bersangkutan melanjutkan ke jenjang yang lebih tinggi.'))]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table.signature', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tangerang, 13 Mei 2019')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kepala Sekolah,')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__sign', { + style: { + height: '3rem' + } + }))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Drs. Engkos Kosasih, M.M.'))])])])]; + } +}; +/* harmony default export */ __webpack_exports__["default"] = (component); + +/***/ }), + +/***/ "./resources/js/components/SuratKelulusan.js": +/*!***************************************************!*\ + !*** ./resources/js/components/SuratKelulusan.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var mithril__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mithril */ "./node_modules/mithril/mithril.mjs"); /* harmony import */ var lodash_isempty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.isempty */ "./node_modules/lodash.isempty/index.js"); /* harmony import */ var lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isempty__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _models_Siswa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./models/Siswa */ "./resources/js/models/Siswa.js"); -/* harmony import */ var _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./models/AccessLog */ "./resources/js/models/AccessLog.js"); +/* harmony import */ var _models_Siswa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../models/Siswa */ "./resources/js/models/Siswa.js"); +/* harmony import */ var _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/AccessLog */ "./resources/js/models/AccessLog.js"); -mithril__WEBPACK_IMPORTED_MODULE_0__["default"].mount(document.body.querySelector('.container'), { +var component = { oninit: function oninit() { _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].fetch(); }, @@ -2410,7 +2498,8 @@ mithril__WEBPACK_IMPORTED_MODULE_0__["default"].mount(document.body.querySelecto } }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__body', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong.letter__body-header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', 'KEPUTUSAN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', 'KEPALA SEKOLAH MENENGAH KEJURUAN (SMK) BHAKTI ANINDYA'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', 'Nomor: 076 / SMK - BA / V / 2019'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', 'TENTANG'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', 'KELULUSAN PESERTA UJIAN DARI SATUAN PENDIDIKAN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', 'TAHUN PELAJARAN 2018 / 2019'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('br'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', 'KEPALA SMK BHAKTI ANINDYA')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('br'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Menimbang'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '1.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Bahwa dalam rangka pengumuman hasil ujian akhir kelas XII Tahun Pelajaran 2018/2019 dipandang perlu untuk menerbitkan surat keputusan tentang kelulusan peserta ujian dari satuan pendidikan SMK Bhakti Anindya.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '2.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Bahwa peserta ujian yang namanya tercantum pada surat keputusan ini dipandang cakap, kompeten, dan layak untuk dinyatakan lulus dari Satuan Pendidikan SMK Bhakti Anindya.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('br'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Mengingat'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '1.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Undang Undang No. 20 Tahun 2003 tentang Sistem Pendidikan Nasional.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '2.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Permendikbud Nomor 57 Tahun 2015 Tentang Penilaian Hasil Belajar Oleh Pemerintah Melalui Ujian Nasional Dan Penilaian Hasil Belajar Oleh Satuan Pendidikan Melalui Ujian Sekolah/ Madrasah/ Pendidikan Kesetaraan Pada SMP/ MTs/ Yang Sederajat Dan SMA/ MA/ SMK Atau Yang Sederajat.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '3.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Peraturan BSNP NOMOR: 0047/P/BSNP/XI/2018 tentang Prosedur Operasional Standar Penyelenggaraan Ujian Nasional Tahun Pelajaran 2018/2019.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '4.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Peraturan BSNP NOMOR: 0048/BSNP/XI/2018 tentang Prosedur Operasional Standar Penyelenggaraan Ujian Sekolah Berstandar Nasaional Tahun Pelajaran 2018/2019.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '5.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Pedoman Penyelenggaraan UKK dan Sertifikasi Siswa SMK pada Ujian Nasional Tahun Pelajaran 2017/2018.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('br'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Memperhatikan'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '1.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Nilat raport semester 1 – 6 Tahun Pelajaran 2016/2017 – 2018/2019.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '2.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Nilai Hasil Ujian Praktik Kejuruan ( UPK ) yang diselenggarakan tanggal 1 April s.d 3 Mei 2019.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '3.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Nilai Hasil Ujian Sekolah Berstandar Nasional (USBN) yang diselenggarakan tanggal 05 – 12 April 2019.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '4.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Nilai Hasil Ujian Nasional Berbasis Komputer (UNBK) yang diselenggarakan tanggal 25 – 28 Maret 2019.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '5.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Hasil pengamatan dan penilaian mengenai sikap, prilaku, dan kepribadian yang bersangkutan selama menjadi siswa SMK Bhakti Anindya.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '6.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Hasil Rapat Pleno Dewan Guru SMK Bhakti Anindya tanggal 10 Mei 2019.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '7.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Surat Keputusan Tentang Kriteria Kelulusan dari Satuan Pendidikan.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center[colspan=6]', 'MEMUTUSKAN :')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Menetapkan'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Pertama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nama Peserta'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current.nama)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tempat & Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current.tempat_lahir + ' , ' + _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current.tanggal_lahir)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'NIS / NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current.nis + ' / ' + _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current.nisn)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nomor Peserta'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current.nopes)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Bidang Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current.bsk)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Program Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current.psk)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kompetensi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.strong', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current.kk)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', ['Dinyatakan ', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.special', 'LULUS'), ' dari satuan pendidikan SMK Bhakti Anindya Tahun Pelajaran 2018/2019'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('br'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kedua'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=4]', 'Surat Keputusan ini dikeluarkan sebagai pengganti ijazah yang akan diterbitkan kemudian.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Ketiga'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=4]', 'Apabila dalam Surat Keputusan ini terdapat kekeliruan akan dilakukan perbaikan sebagaimana mestinya.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Keempat'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=4]', 'Surat Keputusan ini berlaku terhitung mulai tanggal ditetapkan.')])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table.signature', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Ditetapkan di'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tangerang')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Pada Tanggal'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '13 Mei 2019')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kepala Sekolah,')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__sign'))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Drs. Engkos Kosasih, M.M.'))])])])]; } -}); +}; +/* harmony default export */ __webpack_exports__["default"] = (component); /***/ }), diff --git a/resources/js/app.js b/resources/js/app.js index 6929ee7..39784c4 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,274 +1,9 @@ import m from "mithril" -import _isEmpty from "lodash.isempty" -import Siswa from "./models/Siswa" -import AccessLog from "./models/AccessLog" +import SuratKelulusan from "./components/SuratKelulusan" +import SKHasilBelajar from "./components/SKHasilBelajar" -m.mount(document.body.querySelector('.container'), { - oninit: () => { - AccessLog.fetch(); - }, - view: () => { - return [ - m('.header', [ - m('span.italic.text-xs', [ - 'Saat ini sudah ', - m('strong', [ - AccessLog.current.accessed, - ' / ', - AccessLog.current.total, - ]), - ' siswa yang telah melihat pengumuman kelulusan.' - ]), - m('h1.title', 'Pengumuman Kelulusan SMK Bhakti Anindya'), - m('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.'), - ]), - m('form.form', { - onsubmit: e => { - e.preventDefault(); - Siswa.cariData({ - nisn: e.target.elements.nisn.value, - tanggalLahir: e.target.elements.tanggalLahir.value, - }); - } - }, - m('.form-grid', [ - m('.form-group', [ - m('label.form-label[for=input-nisn]', 'NISN'), - m('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), - m('p.input-helper', [ - !_isEmpty(Siswa.error) ? - Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') - : Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') - : '' : '', - 'Nomor Induk Siswa Nasional.', - ]), - ]), - m('.form-group', [ - m('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), - m('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), - m('p.input-helper', [ - !_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', - 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529', - ]), - ]), - m('button.form-submit#input-submit[type=submit]', 'Lihat'), - ])), - m(!_isEmpty(Siswa.current) ? '.letter' : '.letter.hidden', [ - m('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), - m('button.print-button', { - onclick: () => { - window.print(); - } - }, [ - m.trust('⎙'), - ' Print', - ]), - m('.letter__header', [ - m('img[src=img/letter-head.jpg]'), - ]), - m('', { - style: { - height: '1px', - width: '100%', - backgroundColor: '#000', - marginTop: '.5rem', - }}), - m('', { - style: { - height: '3px', - width: '100%', - }}), - m('', { - style: { - height: '3px', - width: '100%', - backgroundColor: '#000', - marginBottom: '1rem', - }}), - m('.letter__body', [ - m('strong.letter__body-header', [ - m('p', 'KEPUTUSAN'), - m('p', 'KEPALA SEKOLAH MENENGAH KEJURUAN (SMK) BHAKTI ANINDYA'), - m('p', 'Nomor: 076 / SMK - BA / V / 2019'), - m('p', 'TENTANG'), - m('p', 'KELULUSAN PESERTA UJIAN DARI SATUAN PENDIDIKAN'), - m('p', 'TAHUN PELAJARAN 2018 / 2019'), - m('br'), - m('p', 'KEPALA SMK BHAKTI ANINDYA'), - ]), - m('br'), - m('table', [ - m('tr', [ - m('td', 'Menimbang'), - m('td', ':'), - m('td', '1.'), - m('td[colspan=3]', 'Bahwa dalam rangka pengumuman hasil ujian akhir kelas XII Tahun Pelajaran 2018/2019 dipandang perlu untuk menerbitkan surat keputusan tentang kelulusan peserta ujian dari satuan pendidikan SMK Bhakti Anindya.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '2.'), - m('td[colspan=3]', 'Bahwa peserta ujian yang namanya tercantum pada surat keputusan ini dipandang cakap, kompeten, dan layak untuk dinyatakan lulus dari Satuan Pendidikan SMK Bhakti Anindya.'), - ]), - m('br'), - m('tr', [ - m('td', 'Mengingat'), - m('td', ':'), - m('td', '1.'), - m('td[colspan=3]', 'Undang Undang No. 20 Tahun 2003 tentang Sistem Pendidikan Nasional.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '2.'), - m('td[colspan=3]', 'Permendikbud Nomor 57 Tahun 2015 Tentang Penilaian Hasil Belajar Oleh Pemerintah Melalui Ujian Nasional Dan Penilaian Hasil Belajar Oleh Satuan Pendidikan Melalui Ujian Sekolah/ Madrasah/ Pendidikan Kesetaraan Pada SMP/ MTs/ Yang Sederajat Dan SMA/ MA/ SMK Atau Yang Sederajat.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '3.'), - m('td[colspan=3]', 'Peraturan BSNP NOMOR: 0047/P/BSNP/XI/2018 tentang Prosedur Operasional Standar Penyelenggaraan Ujian Nasional Tahun Pelajaran 2018/2019.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '4.'), - m('td[colspan=3]', 'Peraturan BSNP NOMOR: 0048/BSNP/XI/2018 tentang Prosedur Operasional Standar Penyelenggaraan Ujian Sekolah Berstandar Nasaional Tahun Pelajaran 2018/2019.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '5.'), - m('td[colspan=3]', 'Pedoman Penyelenggaraan UKK dan Sertifikasi Siswa SMK pada Ujian Nasional Tahun Pelajaran 2017/2018.'), - ]), - m('br'), - m('tr', [ - m('td', 'Memperhatikan'), - m('td', ':'), - m('td', '1.'), - m('td[colspan=3]', 'Nilat raport semester 1 – 6 Tahun Pelajaran 2016/2017 – 2018/2019.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '2.'), - m('td[colspan=3]', 'Nilai Hasil Ujian Praktik Kejuruan ( UPK ) yang diselenggarakan tanggal 1 April s.d 3 Mei 2019.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '3.'), - m('td[colspan=3]', 'Nilai Hasil Ujian Sekolah Berstandar Nasional (USBN) yang diselenggarakan tanggal 05 – 12 April 2019.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '4.'), - m('td[colspan=3]', 'Nilai Hasil Ujian Nasional Berbasis Komputer (UNBK) yang diselenggarakan tanggal 25 – 28 Maret 2019.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '5.'), - m('td[colspan=3]', 'Hasil pengamatan dan penilaian mengenai sikap, prilaku, dan kepribadian yang bersangkutan selama menjadi siswa SMK Bhakti Anindya.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '6.'), - m('td[colspan=3]', 'Hasil Rapat Pleno Dewan Guru SMK Bhakti Anindya tanggal 10 Mei 2019.'), - ]), - m('tr', [ - m('td[colspan=2]'), - m('td', '7.'), - m('td[colspan=3]', 'Surat Keputusan Tentang Kriteria Kelulusan dari Satuan Pendidikan.'), - ]), - m('tr', - m('td.text-center[colspan=6]', 'MEMUTUSKAN :')), - m('tr', [ - m('td', 'Menetapkan'), - m('td', ':'), - ]), - m('tr', [ - m('td', 'Pertama'), - m('td', ':'), - m('td'), - m('td', 'Nama Peserta'), - m('td.strong', ':'), - m('td.strong', Siswa.current.nama), - ]), - m('tr', [ - m('td[colspan=3]'), - m('td', 'Tempat & Tanggal Lahir'), - m('td.strong', ':'), - m('td.strong', Siswa.current.tempat_lahir + ' , ' + Siswa.current.tanggal_lahir), - ]), - m('tr', [ - m('td[colspan=3]'), - m('td', 'NIS / NISN'), - m('td.strong', ':'), - m('td.strong', Siswa.current.nis + ' / ' + Siswa.current.nisn), - ]), - m('tr', [ - m('td[colspan=3]'), - m('td', 'Nomor Peserta'), - m('td.strong', ':'), - m('td.strong', Siswa.current.nopes), - ]), - m('tr', [ - m('td[colspan=3]'), - m('td', 'Bidang Studi Keahlian'), - m('td.strong', ':'), - m('td.strong', Siswa.current.bsk), - ]), - m('tr', [ - m('td[colspan=3]'), - m('td', 'Program Studi Keahlian'), - m('td.strong', ':'), - m('td.strong', Siswa.current.psk), - ]), - m('tr', [ - m('td[colspan=3]'), - m('td', 'Kompetensi Keahlian'), - m('td.strong', ':'), - m('td.strong', Siswa.current.kk), - ]), - m('tr', [ - m('td[colspan=3]'), - m('td[colspan=3]', [ - 'Dinyatakan ', - m('span.special', 'LULUS'), - ' dari satuan pendidikan SMK Bhakti Anindya Tahun Pelajaran 2018/2019', - ]), - ]), - m('br'), - m('tr', [ - m('td', 'Kedua'), - m('td', ':'), - m('td[colspan=4]', 'Surat Keputusan ini dikeluarkan sebagai pengganti ijazah yang akan diterbitkan kemudian.'), - ]), - m('tr', [ - m('td', 'Ketiga'), - m('td', ':'), - m('td[colspan=4]', 'Apabila dalam Surat Keputusan ini terdapat kekeliruan akan dilakukan perbaikan sebagaimana mestinya.'), - ]), - m('tr', [ - m('td', 'Keempat'), - m('td', ':'), - m('td[colspan=4]', 'Surat Keputusan ini berlaku terhitung mulai tanggal ditetapkan.'), - ]), - ]), - m('table.signature', [ - m('tr', [ - m('td', 'Ditetapkan di'), - m('td', ':'), - m('td', 'Tangerang'), - ]), - m('tr', [ - m('td', 'Pada Tanggal'), - m('td', ':'), - m('td', '13 Mei 2019'), - ]), - m('tr', - m('td', 'Kepala Sekolah,')), - m('tr', - m('td[colspan=3]', - m('.letter__sign'))), - m('tr', - m('td[colspan=3]', 'Drs. Engkos Kosasih, M.M.')), - ]), - ]), - ]), - ]; - }, +m.route.prefix('#'); +m.route(document.body.querySelector('.container'), '/', { + '/': SuratKelulusan, + '/hasil-belajar': SKHasilBelajar, }); diff --git a/resources/js/components/ExampleComponent.vue b/resources/js/components/ExampleComponent.vue deleted file mode 100644 index 3fb9f9a..0000000 --- a/resources/js/components/ExampleComponent.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/resources/js/components/SKHasilBelajar.js b/resources/js/components/SKHasilBelajar.js new file mode 100644 index 0000000..a6edaad --- /dev/null +++ b/resources/js/components/SKHasilBelajar.js @@ -0,0 +1,232 @@ +import m from "mithril" + +var component = { + view: () => { + return [ + m('.header', [ + m('span.italic.text-xs', [ + 'Saat ini sudah ', + m('strong', [ + //AccessLog.current.accessed, + ' / ', + //AccessLog.current.total, + ]), + ' siswa yang telah melihat pengumuman kelulusan.' + ]), + m('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), + m('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.'), + ]), + m('form.form', { + onsubmit: e => { + e.preventDefault(); + //Siswa.cariData({ + //nisn: e.target.elements.nisn.value, + //tanggalLahir: e.target.elements.tanggalLahir.value, + //}); + } + }, + m('.form-grid', [ + m('.form-group', [ + m('label.form-label[for=input-nisn]', 'NISN'), + m('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), + m('p.input-helper', [ + //!_isEmpty(Siswa.error) ? + //Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') + //: Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') + //: '' : '', + 'Nomor Induk Siswa Nasional.', + ]), + ]), + m('.form-group', [ + m('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), + m('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), + m('p.input-helper', [ + //!_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', + 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529', + ]), + ]), + m('button.form-submit#input-submit[type=submit]', 'Lihat'), + ])), + //m(!_isEmpty(Siswa.current) ? '.letter' : '.letter.hidden', [ + m('.letter', [ + m('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), + m('button.print-button', { + onclick: () => { + window.print(); + } + }, [ + m.trust('⎙'), + ' Print', + ]), + m('.letter__header', [ + m('img[src=img/letter-head.jpg]'), + ]), + m('', { + style: { + height: '1px', + width: '100%', + backgroundColor: '#000', + marginTop: '.5rem', + }}), + m('', { + style: { + height: '3px', + width: '100%', + }}), + m('', { + style: { + height: '3px', + width: '100%', + backgroundColor: '#000', + marginBottom: '1rem', + }}), + m('.letter__body', [ + m('strong.letter__body-header', [ + m('p', m('u', 'SURAT KETERANGAN')), + m('p.font-normal', 'Nomor: 077/SMK-BA/V/2019'), + ]), + m('br'), + m('table', [ + m('tr', + m('td[colspan=6]', 'Yang bertanda tangan di bawah ini :')), + m('tr', [ + m('td'), + m('td', 'Nama'), + m('td', ':'), + m('td[colspan=3]', 'Drs. Engkos Kosasih, M.M.'), + ]), + m('tr', [ + m('td'), + m('td', 'Jabatan'), + m('td', ':'), + m('td[colspan=3]', 'Kepala Sekolah'), + ]), + m('tr', [ + m('td'), + m('td', 'Asal Sekolah'), + m('td', ':'), + m('td[colspan=3]', 'SMK Bhakti Anindya'), + ]), + m('tr', + m('td', + m.trust(' '))), + m('tr', + m('td[colspan=6]', 'Menerangkan bahwa')), + m('tr', + m('td', + m.trust(' '))), + m('tr', [ + m('td'), + m('td', 'Nama'), + m('td', ':'), + m('td[colspan=3]', 'A\'AN SAPUTRA'), + ]), + m('tr', [ + m('td'), + m('td', 'Tempat / Tanggal Lahir'), + m('td', ':'), + m('td', 'SAMARINDA'), + m('td[colspan=2]', ', 22 JANUARI 2001'), + ]), + m('tr', [ + m('td'), + m('td', 'NIS / NISN'), + m('td', ':'), + m('td', '1166189'), + m('td[colspan=2]', '/ 0013312008'), + ]), + m('tr', [ + m('td'), + m('td', 'Nomor Peserta'), + m('td', ':'), + m('td[colspan=3]', '4-19-30-02-059-001-8'), + ]), + m('tr', [ + m('td'), + m('td', 'Kelas'), + m('td', ':'), + m('td[colspan=3]', 'XII TKJ 1'), + ]), + m('tr', [ + m('td'), + m('td', 'Bidang Studi Keahlian'), + m('td', ':'), + m('td[colspan=3]', 'Teknologi Informasi dan Komunikasi'), + ]), + m('tr', [ + m('td'), + m('td', 'Program Studi Keahlian'), + m('td', ':'), + m('td[colspan=3]', 'Teknik Komputer dan Informatika'), + ]), + m('tr', [ + m('td'), + m('td', 'Kompetensi Keahlian'), + m('td', ':'), + m('td[colspan=3]', 'Teknik Komputer dan Jaringan'), + ]), + m('tr', + m('td', + m.trust(' '))), + m('tr', + m('td[colspan=6]', 'Adalah benar siswa SMK Bhakti Anindya, Kota Tangerang dan pada tanggal 13 Mei 2019 telah dinyatakan lulus')), + m('tr', + m('td[colspan=6]', 'Berikut hasil belajar siswa tersebut :')), + m('tr', + m('td', + m.trust(' '))), + m('tr', + m('td[colspan=6]', + m('table.nilai', [ + m('tr', [ + m('th', { style: { width: '5%' } }, 'No.'), + m('th[colspan=2]', 'Mata Pelajaran'), + m('th.long.md:w-1/5', 'Rata-rata Raport Semester 1-6'), + m('th.short.md:w-1/5', 'Raport'), + m('th.long.md:w-1/5', 'Ujian Sekolah Berstandar Nasional'), + m('th.short.md:w-1/5', 'USBN'), + m('th.long.md:w-1/5', 'Ujian Nasional Berbasis Komputer'), + m('th.short.md:w-1/5', 'UNBK'), + ]), + m('tr', [ + m('th', 'A.'), + m('th[colspan=5].text-left', 'Normatif'), + ]), + m('tr', [ + m('td.text-right', '1.'), + m('td[colspan=2]', 'Pendidikan Agama'), + m('td.text-center', 'xx.xx'), + m('td.text-center', 'xx.xx'), + m('td.text-center', 'xx.xx'), + ]), + m('tr', [ + m('th[colspan=3]', 'Rata-rata'), + m('td.text-center', 'xx.xx'), + m('td.text-center', 'xx.xx'), + m('td.text-center', 'xx.xx'), + ]), + ]))), + m('tr', + m('td', + m.trust(' '))), + m('tr', + m('td[colspan=6]', 'Demikian Surat Keterangan ini dibuat untuk siswa yang bersangkutan melanjutkan ke jenjang yang lebih tinggi.')), + ]), + m('table.signature', [ + m('tr', + m('td', 'Tangerang, 13 Mei 2019')), + m('tr', + m('td', 'Kepala Sekolah,')), + m('tr', + m('td', + m('.letter__sign', { style: { height: '3rem' } }))), + m('tr', + m('td', 'Drs. Engkos Kosasih, M.M.')), + ]), + ]), + ]), + ]; + }, +}; + +export default component; diff --git a/resources/js/components/SuratKelulusan.js b/resources/js/components/SuratKelulusan.js new file mode 100644 index 0000000..534ad8a --- /dev/null +++ b/resources/js/components/SuratKelulusan.js @@ -0,0 +1,276 @@ +import m from "mithril"; +import _isEmpty from "lodash.isempty" +import Siswa from "../models/Siswa" +import AccessLog from "../models/AccessLog" + +var component = { + oninit: () => { + AccessLog.fetch(); + }, + view: () => { + return [ + m('.header', [ + m('span.italic.text-xs', [ + 'Saat ini sudah ', + m('strong', [ + AccessLog.current.accessed, + ' / ', + AccessLog.current.total, + ]), + ' siswa yang telah melihat pengumuman kelulusan.' + ]), + m('h1.title', 'Pengumuman Kelulusan SMK Bhakti Anindya'), + m('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.'), + ]), + m('form.form', { + onsubmit: e => { + e.preventDefault(); + Siswa.cariData({ + nisn: e.target.elements.nisn.value, + tanggalLahir: e.target.elements.tanggalLahir.value, + }); + } + }, + m('.form-grid', [ + m('.form-group', [ + m('label.form-label[for=input-nisn]', 'NISN'), + m('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), + m('p.input-helper', [ + !_isEmpty(Siswa.error) ? + Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') + : Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') + : '' : '', + 'Nomor Induk Siswa Nasional.', + ]), + ]), + m('.form-group', [ + m('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), + m('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), + m('p.input-helper', [ + !_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', + 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529', + ]), + ]), + m('button.form-submit#input-submit[type=submit]', 'Lihat'), + ])), + m(!_isEmpty(Siswa.current) ? '.letter' : '.letter.hidden', [ + m('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), + m('button.print-button', { + onclick: () => { + window.print(); + } + }, [ + m.trust('⎙'), + ' Print', + ]), + m('.letter__header', [ + m('img[src=img/letter-head.jpg]'), + ]), + m('', { + style: { + height: '1px', + width: '100%', + backgroundColor: '#000', + marginTop: '.5rem', + }}), + m('', { + style: { + height: '3px', + width: '100%', + }}), + m('', { + style: { + height: '3px', + width: '100%', + backgroundColor: '#000', + marginBottom: '1rem', + }}), + m('.letter__body', [ + m('strong.letter__body-header', [ + m('p', 'KEPUTUSAN'), + m('p', 'KEPALA SEKOLAH MENENGAH KEJURUAN (SMK) BHAKTI ANINDYA'), + m('p', 'Nomor: 076 / SMK - BA / V / 2019'), + m('p', 'TENTANG'), + m('p', 'KELULUSAN PESERTA UJIAN DARI SATUAN PENDIDIKAN'), + m('p', 'TAHUN PELAJARAN 2018 / 2019'), + m('br'), + m('p', 'KEPALA SMK BHAKTI ANINDYA'), + ]), + m('br'), + m('table', [ + m('tr', [ + m('td', 'Menimbang'), + m('td', ':'), + m('td', '1.'), + m('td[colspan=3]', 'Bahwa dalam rangka pengumuman hasil ujian akhir kelas XII Tahun Pelajaran 2018/2019 dipandang perlu untuk menerbitkan surat keputusan tentang kelulusan peserta ujian dari satuan pendidikan SMK Bhakti Anindya.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '2.'), + m('td[colspan=3]', 'Bahwa peserta ujian yang namanya tercantum pada surat keputusan ini dipandang cakap, kompeten, dan layak untuk dinyatakan lulus dari Satuan Pendidikan SMK Bhakti Anindya.'), + ]), + m('br'), + m('tr', [ + m('td', 'Mengingat'), + m('td', ':'), + m('td', '1.'), + m('td[colspan=3]', 'Undang Undang No. 20 Tahun 2003 tentang Sistem Pendidikan Nasional.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '2.'), + m('td[colspan=3]', 'Permendikbud Nomor 57 Tahun 2015 Tentang Penilaian Hasil Belajar Oleh Pemerintah Melalui Ujian Nasional Dan Penilaian Hasil Belajar Oleh Satuan Pendidikan Melalui Ujian Sekolah/ Madrasah/ Pendidikan Kesetaraan Pada SMP/ MTs/ Yang Sederajat Dan SMA/ MA/ SMK Atau Yang Sederajat.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '3.'), + m('td[colspan=3]', 'Peraturan BSNP NOMOR: 0047/P/BSNP/XI/2018 tentang Prosedur Operasional Standar Penyelenggaraan Ujian Nasional Tahun Pelajaran 2018/2019.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '4.'), + m('td[colspan=3]', 'Peraturan BSNP NOMOR: 0048/BSNP/XI/2018 tentang Prosedur Operasional Standar Penyelenggaraan Ujian Sekolah Berstandar Nasaional Tahun Pelajaran 2018/2019.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '5.'), + m('td[colspan=3]', 'Pedoman Penyelenggaraan UKK dan Sertifikasi Siswa SMK pada Ujian Nasional Tahun Pelajaran 2017/2018.'), + ]), + m('br'), + m('tr', [ + m('td', 'Memperhatikan'), + m('td', ':'), + m('td', '1.'), + m('td[colspan=3]', 'Nilat raport semester 1 – 6 Tahun Pelajaran 2016/2017 – 2018/2019.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '2.'), + m('td[colspan=3]', 'Nilai Hasil Ujian Praktik Kejuruan ( UPK ) yang diselenggarakan tanggal 1 April s.d 3 Mei 2019.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '3.'), + m('td[colspan=3]', 'Nilai Hasil Ujian Sekolah Berstandar Nasional (USBN) yang diselenggarakan tanggal 05 – 12 April 2019.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '4.'), + m('td[colspan=3]', 'Nilai Hasil Ujian Nasional Berbasis Komputer (UNBK) yang diselenggarakan tanggal 25 – 28 Maret 2019.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '5.'), + m('td[colspan=3]', 'Hasil pengamatan dan penilaian mengenai sikap, prilaku, dan kepribadian yang bersangkutan selama menjadi siswa SMK Bhakti Anindya.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '6.'), + m('td[colspan=3]', 'Hasil Rapat Pleno Dewan Guru SMK Bhakti Anindya tanggal 10 Mei 2019.'), + ]), + m('tr', [ + m('td[colspan=2]'), + m('td', '7.'), + m('td[colspan=3]', 'Surat Keputusan Tentang Kriteria Kelulusan dari Satuan Pendidikan.'), + ]), + m('tr', + m('td.text-center[colspan=6]', 'MEMUTUSKAN :')), + m('tr', [ + m('td', 'Menetapkan'), + m('td', ':'), + ]), + m('tr', [ + m('td', 'Pertama'), + m('td', ':'), + m('td'), + m('td', 'Nama Peserta'), + m('td.strong', ':'), + m('td.strong', Siswa.current.nama), + ]), + m('tr', [ + m('td[colspan=3]'), + m('td', 'Tempat & Tanggal Lahir'), + m('td.strong', ':'), + m('td.strong', Siswa.current.tempat_lahir + ' , ' + Siswa.current.tanggal_lahir), + ]), + m('tr', [ + m('td[colspan=3]'), + m('td', 'NIS / NISN'), + m('td.strong', ':'), + m('td.strong', Siswa.current.nis + ' / ' + Siswa.current.nisn), + ]), + m('tr', [ + m('td[colspan=3]'), + m('td', 'Nomor Peserta'), + m('td.strong', ':'), + m('td.strong', Siswa.current.nopes), + ]), + m('tr', [ + m('td[colspan=3]'), + m('td', 'Bidang Studi Keahlian'), + m('td.strong', ':'), + m('td.strong', Siswa.current.bsk), + ]), + m('tr', [ + m('td[colspan=3]'), + m('td', 'Program Studi Keahlian'), + m('td.strong', ':'), + m('td.strong', Siswa.current.psk), + ]), + m('tr', [ + m('td[colspan=3]'), + m('td', 'Kompetensi Keahlian'), + m('td.strong', ':'), + m('td.strong', Siswa.current.kk), + ]), + m('tr', [ + m('td[colspan=3]'), + m('td[colspan=3]', [ + 'Dinyatakan ', + m('span.special', 'LULUS'), + ' dari satuan pendidikan SMK Bhakti Anindya Tahun Pelajaran 2018/2019', + ]), + ]), + m('br'), + m('tr', [ + m('td', 'Kedua'), + m('td', ':'), + m('td[colspan=4]', 'Surat Keputusan ini dikeluarkan sebagai pengganti ijazah yang akan diterbitkan kemudian.'), + ]), + m('tr', [ + m('td', 'Ketiga'), + m('td', ':'), + m('td[colspan=4]', 'Apabila dalam Surat Keputusan ini terdapat kekeliruan akan dilakukan perbaikan sebagaimana mestinya.'), + ]), + m('tr', [ + m('td', 'Keempat'), + m('td', ':'), + m('td[colspan=4]', 'Surat Keputusan ini berlaku terhitung mulai tanggal ditetapkan.'), + ]), + ]), + m('table.signature', [ + m('tr', [ + m('td', 'Ditetapkan di'), + m('td', ':'), + m('td', 'Tangerang'), + ]), + m('tr', [ + m('td', 'Pada Tanggal'), + m('td', ':'), + m('td', '13 Mei 2019'), + ]), + m('tr', + m('td', 'Kepala Sekolah,')), + m('tr', + m('td[colspan=3]', + m('.letter__sign'))), + m('tr', + m('td[colspan=3]', 'Drs. Engkos Kosasih, M.M.')), + ]), + ]), + ]), + ]; + }, +}; + +export default component; diff --git a/resources/sass/main.scss b/resources/sass/main.scss index af13715..0585a17 100644 --- a/resources/sass/main.scss +++ b/resources/sass/main.scss @@ -84,6 +84,20 @@ span.error { } } + table.nilai { + th, td { + @apply border border-black px-1; + } + + .long { + @apply hidden; + } + + .short { + display: table-cell; + } + } + table.signature { @apply w-auto ml-auto mt-4; @@ -156,6 +170,16 @@ span.error { .print-button { display: initial; } + + table.nilai { + .long { + display: table-cell; + } + + .short { + @apply hidden; + } + } } } From 9b91fe40cefa5efeac764fe688ac3331da4bff38 Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Tue, 14 May 2019 14:58:06 +0700 Subject: [PATCH 02/11] Created command for importing data from excel --- app/Console/Commands/ImportExcel.php | 48 +++ app/Events/HasilBelajarImported.php | 40 +++ app/HasilBelajar.php | 24 ++ app/Imports/HasilBelajarsImport.php | 49 +++ app/Listeners/LogImportedHasilBelajar.php | 32 ++ app/Providers/EventServiceProvider.php | 5 + composer.json | 4 +- composer.lock | 329 +++++++++++++++++- config/app.php | 2 + config/excel.php | 186 ++++++++++ ..._14_035754_create_hasil_belajars_table.php | 40 +++ 11 files changed, 757 insertions(+), 2 deletions(-) create mode 100644 app/Console/Commands/ImportExcel.php create mode 100644 app/Events/HasilBelajarImported.php create mode 100644 app/HasilBelajar.php create mode 100644 app/Imports/HasilBelajarsImport.php create mode 100644 app/Listeners/LogImportedHasilBelajar.php create mode 100644 config/excel.php create mode 100644 database/migrations/2019_05_14_035754_create_hasil_belajars_table.php diff --git a/app/Console/Commands/ImportExcel.php b/app/Console/Commands/ImportExcel.php new file mode 100644 index 0000000..6c2affe --- /dev/null +++ b/app/Console/Commands/ImportExcel.php @@ -0,0 +1,48 @@ +argument('filename')); + } catch (\Exception $e) { + echo $e->getMessage(); + } + } +} diff --git a/app/Events/HasilBelajarImported.php b/app/Events/HasilBelajarImported.php new file mode 100644 index 0000000..d345a60 --- /dev/null +++ b/app/Events/HasilBelajarImported.php @@ -0,0 +1,40 @@ +hasilBelajar = $hasilBelajar; + } + + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|array + */ + public function broadcastOn() + { + return new PrivateChannel('channel-name'); + } +} diff --git a/app/HasilBelajar.php b/app/HasilBelajar.php new file mode 100644 index 0000000..681c68d --- /dev/null +++ b/app/HasilBelajar.php @@ -0,0 +1,24 @@ + 'array', + ]; + + protected $dispatchesEvents = [ + 'saved' => HasilBelajarImported::class, + ]; +} diff --git a/app/Imports/HasilBelajarsImport.php b/app/Imports/HasilBelajarsImport.php new file mode 100644 index 0000000..61c26c9 --- /dev/null +++ b/app/Imports/HasilBelajarsImport.php @@ -0,0 +1,49 @@ +where('nis', $row['nis'])->first(); + + if (!$siswa) + return null; + + $fieldMeta = []; + foreach ($row as $key => $value) { + if (preg_match("/\_+/", $key)) { + $rowNames = explode('_', $key); + $fieldMeta[$rowNames[0]][$rowNames[1]][$rowNames[2]] = round($value, 2); + } + else { + $fieldMeta[$key] = $value; + } + } + + return new HasilBelajar([ + 'siswa_id' => $siswa->id, + 'meta' => $fieldMeta, + ]); + } + + public function sheets(): array + { + return [ + new FirstSheetImport() + ]; + } +} diff --git a/app/Listeners/LogImportedHasilBelajar.php b/app/Listeners/LogImportedHasilBelajar.php new file mode 100644 index 0000000..f5ab923 --- /dev/null +++ b/app/Listeners/LogImportedHasilBelajar.php @@ -0,0 +1,32 @@ +debug($event->hasilBelajar); + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 6c64e52..299f673 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,6 +2,8 @@ namespace App\Providers; +use App\Events\HasilBelajarImported; +use App\Listeners\LogImportedHasilBelajar; use Illuminate\Support\Facades\Event; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; @@ -18,6 +20,9 @@ class EventServiceProvider extends ServiceProvider Registered::class => [ SendEmailVerificationNotification::class, ], + HasilBelajarImported::class => [ + LogImportedHasilBelajar::class, + ], ]; /** diff --git a/composer.json b/composer.json index 0d5f601..4af7967 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,9 @@ "php": "^7.1.3", "fideloper/proxy": "^4.0", "laravel/framework": "5.8.*", - "laravel/tinker": "^1.0" + "laravel/tinker": "^1.0", + "maatwebsite/excel": "^3.1", + "phpoffice/phpspreadsheet": "^1.6" }, "require-dev": { "beyondcode/laravel-dump-server": "^1.0", diff --git a/composer.lock b/composer.lock index 4e87cb5..cf089a4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f5a0a61c9139ecda3fa774f43e4c4d47", + "content-hash": "de40b8ae2535e84b7da46e8c705c73c5", "packages": [ { "name": "dnoegel/php-xdg-base-dir", @@ -753,6 +753,239 @@ ], "time": "2019-03-30T13:22:34+00:00" }, + { + "name": "maatwebsite/excel", + "version": "3.1.13", + "source": { + "type": "git", + "url": "https://github.com/Maatwebsite/Laravel-Excel.git", + "reference": "d79ee01175c6a5e93f2a873dcda1b755b7570076" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Maatwebsite/Laravel-Excel/zipball/d79ee01175c6a5e93f2a873dcda1b755b7570076", + "reference": "d79ee01175c6a5e93f2a873dcda1b755b7570076", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/support": "5.5.*|5.6.*|5.7.*|5.8.*", + "opis/closure": "^3.1", + "php": "^7.0", + "phpoffice/phpspreadsheet": "^1.6" + }, + "require-dev": { + "mockery/mockery": "^1.1", + "orchestra/database": "^3.8", + "orchestra/testbench": "^3.8", + "phpunit/phpunit": "^8.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ], + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + } + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@maatwebsite.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "time": "2019-05-08T12:05:59+00:00" + }, + { + "name": "markbaker/complex", + "version": "1.4.7", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/1ea674a8308baf547cbcbd30c5fcd6d301b7c000", + "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", + "phpcompatibility/php-compatibility": "^8.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "2.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.35|^5.4.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "^3.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + }, + "files": [ + "classes/src/functions/abs.php", + "classes/src/functions/acos.php", + "classes/src/functions/acosh.php", + "classes/src/functions/acot.php", + "classes/src/functions/acoth.php", + "classes/src/functions/acsc.php", + "classes/src/functions/acsch.php", + "classes/src/functions/argument.php", + "classes/src/functions/asec.php", + "classes/src/functions/asech.php", + "classes/src/functions/asin.php", + "classes/src/functions/asinh.php", + "classes/src/functions/atan.php", + "classes/src/functions/atanh.php", + "classes/src/functions/conjugate.php", + "classes/src/functions/cos.php", + "classes/src/functions/cosh.php", + "classes/src/functions/cot.php", + "classes/src/functions/coth.php", + "classes/src/functions/csc.php", + "classes/src/functions/csch.php", + "classes/src/functions/exp.php", + "classes/src/functions/inverse.php", + "classes/src/functions/ln.php", + "classes/src/functions/log2.php", + "classes/src/functions/log10.php", + "classes/src/functions/negative.php", + "classes/src/functions/pow.php", + "classes/src/functions/rho.php", + "classes/src/functions/sec.php", + "classes/src/functions/sech.php", + "classes/src/functions/sin.php", + "classes/src/functions/sinh.php", + "classes/src/functions/sqrt.php", + "classes/src/functions/tan.php", + "classes/src/functions/tanh.php", + "classes/src/functions/theta.php", + "classes/src/operations/add.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "time": "2018-10-13T23:28:42+00:00" + }, + { + "name": "markbaker/matrix", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "6ea97472b5baf12119b4f31f802835b820dd6d64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/6ea97472b5baf12119b4f31f802835b820dd6d64", + "reference": "6ea97472b5baf12119b4f31f802835b820dd6d64", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", + "phpcompatibility/php-compatibility": "^8.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "2.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.35|^5.4.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "^3.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + }, + "files": [ + "classes/src/functions/adjoint.php", + "classes/src/functions/antidiagonal.php", + "classes/src/functions/cofactors.php", + "classes/src/functions/determinant.php", + "classes/src/functions/diagonal.php", + "classes/src/functions/identity.php", + "classes/src/functions/inverse.php", + "classes/src/functions/minors.php", + "classes/src/functions/trace.php", + "classes/src/functions/transpose.php", + "classes/src/operations/add.php", + "classes/src/operations/directsum.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "time": "2018-11-04T22:12:12+00:00" + }, { "name": "monolog/monolog", "version": "1.24.0", @@ -1048,6 +1281,100 @@ ], "time": "2018-07-02T15:55:56+00:00" }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "bf00f0cc5f55c354018f9a9ef15e6e3e1a229051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/bf00f0cc5f55c354018f9a9ef15e6e3e1a229051", + "reference": "bf00f0cc5f55c354018f9a9ef15e6e3e1a229051", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "markbaker/complex": "^1.4", + "markbaker/matrix": "^1.1", + "php": "^5.6|^7.0", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "^1.0.0", + "dompdf/dompdf": "^0.8.0", + "friendsofphp/php-cs-fixer": "@stable", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "^7.0.0", + "phpcompatibility/php-compatibility": "^8.0", + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.3", + "tecnickcom/tcpdf": "^6.2" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + }, + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "time": "2019-01-02T04:42:54+00:00" + }, { "name": "phpoption/phpoption", "version": "1.5.0", diff --git a/config/app.php b/config/app.php index c9960cd..2ee2f14 100644 --- a/config/app.php +++ b/config/app.php @@ -165,6 +165,7 @@ return [ /* * Package Service Providers... */ + Maatwebsite\Excel\ExcelServiceProvider::class, /* * Application Service Providers... @@ -225,6 +226,7 @@ return [ 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, + 'Excel' => Maatwebsite\Excel\Facades\Excel::class, ], diff --git a/config/excel.php b/config/excel.php new file mode 100644 index 0000000..3769518 --- /dev/null +++ b/config/excel.php @@ -0,0 +1,186 @@ + [ + + /* + |-------------------------------------------------------------------------- + | Chunk size + |-------------------------------------------------------------------------- + | + | When using FromQuery, the query is automatically chunked. + | Here you can specify how big the chunk should be. + | + */ + 'chunk_size' => 1000, + + /* + |-------------------------------------------------------------------------- + | Pre-calculate formulas during export + |-------------------------------------------------------------------------- + */ + 'pre_calculate_formulas' => false, + + /* + |-------------------------------------------------------------------------- + | CSV Settings + |-------------------------------------------------------------------------- + | + | Configure e.g. delimiter, enclosure and line ending for CSV exports. + | + */ + 'csv' => [ + 'delimiter' => ',', + 'enclosure' => '"', + 'line_ending' => PHP_EOL, + 'use_bom' => false, + 'include_separator_line' => false, + 'excel_compatibility' => false, + ], + ], + + 'imports' => [ + + 'read_only' => true, + + 'heading_row' => [ + + /* + |-------------------------------------------------------------------------- + | Heading Row Formatter + |-------------------------------------------------------------------------- + | + | Configure the heading row formatter. + | Available options: none|slug|custom + | + */ + 'formatter' => 'slug', + ], + + /* + |-------------------------------------------------------------------------- + | CSV Settings + |-------------------------------------------------------------------------- + | + | Configure e.g. delimiter, enclosure and line ending for CSV imports. + | + */ + 'csv' => [ + 'delimiter' => ',', + 'enclosure' => '"', + 'line_ending' => PHP_EOL, + 'use_bom' => false, + 'include_separator_line' => false, + 'excel_compatibility' => false, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Extension detector + |-------------------------------------------------------------------------- + | + | Configure here which writer type should be used when + | the package needs to guess the correct type + | based on the extension alone. + | + */ + 'extension_detector' => [ + 'xlsx' => Excel::XLSX, + 'xlsm' => Excel::XLSX, + 'xltx' => Excel::XLSX, + 'xltm' => Excel::XLSX, + 'xls' => Excel::XLS, + 'xlt' => Excel::XLS, + 'ods' => Excel::ODS, + 'ots' => Excel::ODS, + 'slk' => Excel::SLK, + 'xml' => Excel::XML, + 'gnumeric' => Excel::GNUMERIC, + 'htm' => Excel::HTML, + 'html' => Excel::HTML, + 'csv' => Excel::CSV, + 'tsv' => Excel::TSV, + + /* + |-------------------------------------------------------------------------- + | PDF Extension + |-------------------------------------------------------------------------- + | + | Configure here which Pdf driver should be used by default. + | Available options: Excel::MPDF | Excel::TCPDF | Excel::DOMPDF + | + */ + 'pdf' => Excel::DOMPDF, + ], + + 'value_binder' => [ + + /* + |-------------------------------------------------------------------------- + | Default Value Binder + |-------------------------------------------------------------------------- + | + | PhpSpreadsheet offers a way to hook into the process of a value being + | written to a cell. In there some assumptions are made on how the + | value should be formatted. If you want to change those defaults, + | you can implement your own default value binder. + | + */ + 'default' => Maatwebsite\Excel\DefaultValueBinder::class, + ], + + 'transactions' => [ + + /* + |-------------------------------------------------------------------------- + | Transaction Handler + |-------------------------------------------------------------------------- + | + | By default the import is wrapped in a transaction. This is useful + | for when an import may fail and you want to retry it. With the + | transactions, the previous import gets rolled-back. + | + | You can disable the transaction handler by setting this to null. + | Or you can choose a custom made transaction handler here. + | + | Supported handlers: null|db + | + */ + 'handler' => 'db', + ], + + 'temporary_files' => [ + + /* + |-------------------------------------------------------------------------- + | Local Temporary Path + |-------------------------------------------------------------------------- + | + | When exporting and importing files, we use a temporary file, before + | storing reading or downloading. Here you can customize that path. + | + */ + 'local_path' => sys_get_temp_dir(), + + /* + |-------------------------------------------------------------------------- + | Remote Temporary Disk + |-------------------------------------------------------------------------- + | + | When dealing with a multi server setup with queues in which you + | cannot rely on having a shared local temporary path, you might + | want to store the temporary file on a shared disk. During the + | queue executing, we'll retrieve the temporary file from that + | location instead. When left to null, it will always use + | the local path. This setting only has effect when using + | in conjunction with queued imports and exports. + | + */ + 'remote_disk' => null, + + ], +]; diff --git a/database/migrations/2019_05_14_035754_create_hasil_belajars_table.php b/database/migrations/2019_05_14_035754_create_hasil_belajars_table.php new file mode 100644 index 0000000..0a822fc --- /dev/null +++ b/database/migrations/2019_05_14_035754_create_hasil_belajars_table.php @@ -0,0 +1,40 @@ +bigIncrements('id'); + $table->unsignedBigInteger('siswa_id'); + $table->longText('meta'); + $table->timestamps(); + $table->softDeletes(); + + $table->foreign('siswa_id') + ->references('id') + ->on('siswas') + ->onUpdate('cascade') + ->onDelete('restrict'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('hasil_belajars'); + } +} From dbe517c1fc9e422370de1ee8ea250eddc27534b3 Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Tue, 14 May 2019 15:26:44 +0700 Subject: [PATCH 03/11] Preparing new api for hasil-belajar --- ...332_add_url_field_to_access_logs_table.php | 34 +++++++++++++++++++ resources/js/components/SKHasilBelajar.js | 1 + resources/js/components/SuratKelulusan.js | 1 + resources/js/models/AccessLog.js | 3 +- resources/js/models/HasilBelajar.js | 24 +++++++++++++ routes/api.php | 6 ++-- 6 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 database/migrations/2019_05_14_080332_add_url_field_to_access_logs_table.php create mode 100644 resources/js/models/HasilBelajar.js diff --git a/database/migrations/2019_05_14_080332_add_url_field_to_access_logs_table.php b/database/migrations/2019_05_14_080332_add_url_field_to_access_logs_table.php new file mode 100644 index 0000000..6759d74 --- /dev/null +++ b/database/migrations/2019_05_14_080332_add_url_field_to_access_logs_table.php @@ -0,0 +1,34 @@ +string('url'); + }); + + DB::table('access_logs')->update(['url' => '/api/siswa']); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('access_logs', function (Blueprint $table) { + $table->dropColumn('url'); + }); + } +} diff --git a/resources/js/components/SKHasilBelajar.js b/resources/js/components/SKHasilBelajar.js index a6edaad..6e4eb59 100644 --- a/resources/js/components/SKHasilBelajar.js +++ b/resources/js/components/SKHasilBelajar.js @@ -22,6 +22,7 @@ var component = { //Siswa.cariData({ //nisn: e.target.elements.nisn.value, //tanggalLahir: e.target.elements.tanggalLahir.value, + //src: 'sk-hasil-belajar', //}); } }, diff --git a/resources/js/components/SuratKelulusan.js b/resources/js/components/SuratKelulusan.js index 534ad8a..73abeb0 100644 --- a/resources/js/components/SuratKelulusan.js +++ b/resources/js/components/SuratKelulusan.js @@ -28,6 +28,7 @@ var component = { Siswa.cariData({ nisn: e.target.elements.nisn.value, tanggalLahir: e.target.elements.tanggalLahir.value, + src: 'surat-kelulusan', }); } }, diff --git a/resources/js/models/AccessLog.js b/resources/js/models/AccessLog.js index 5624520..5270ef8 100644 --- a/resources/js/models/AccessLog.js +++ b/resources/js/models/AccessLog.js @@ -2,10 +2,11 @@ import m from "mithril" var model = { current: {}, - fetch: () => { + fetch: src => { m.request({ method: 'get', url: '/api/access_log', + data: { src }, }) .then(response => { model.current = response; diff --git a/resources/js/models/HasilBelajar.js b/resources/js/models/HasilBelajar.js new file mode 100644 index 0000000..2c023e8 --- /dev/null +++ b/resources/js/models/HasilBelajar.js @@ -0,0 +1,24 @@ +import m from "mihtril" +import AccessLog from "./AccessLog" + +var model = { + current: {}, + error: {}, + cariData: data => { + model.current = {}; + m.request({ + method: 'post', + url: '/api/hasil-belajar', + data, + }) + .then(response => { + model.current = response; + console.log(model.current); + }) + .catch(e => { + model.error = JSON.parse(e.message); + }); + }, +}; + +export default model; diff --git a/routes/api.php b/routes/api.php index edf2838..662e3b6 100644 --- a/routes/api.php +++ b/routes/api.php @@ -45,14 +45,14 @@ Route::post('/siswa', function (Request $request) { } // Write to log - App\AccessLog::create(['siswa_id' => $siswa->id]); + App\AccessLog::create(['siswa_id' => $siswa->id, 'src' => $request->src]); return $siswa; }); -Route::get('/access_log', function () { +Route::get('/access_log', function (Request $request) { // Get the number of unique access - $logs = DB::table('access_logs')->select(DB::raw('count(*) as num')) + $logs = DB::table('access_logs')->select(DB::raw('count(*) as num where src = ?', $request->src)) ->groupBy('siswa_id') ->get() ->count(); From 58391655313d1cea701d4d1c44e8fafa1031be77 Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Wed, 15 May 2019 16:16:21 +0700 Subject: [PATCH 04/11] Improving view --- app/AccessLog.php | 2 +- app/HasilBelajar.php | 5 + app/Http/Controllers/AccessLogController.php | 41 + .../Controllers/HasilBelajarController.php | 63 + app/Http/Controllers/SiswaController.php | 69 + app/Siswa.php | 5 + ...28_add_src_field_to_access_logs_table.php} | 8 +- package-lock.json | 5 + package.json | 3 +- public/css/main.css | 17 + public/js/app.js | 2516 ++++++++++++++++- resources/js/components/SKHasilBelajar.js | 179 +- resources/js/components/SuratKelulusan.js | 2 +- resources/js/models/AccessLog.js | 12 +- resources/js/models/HasilBelajar.js | 6 +- resources/js/models/Siswa.js | 2 +- resources/sass/main.scss | 19 + routes/api.php | 61 +- 18 files changed, 2895 insertions(+), 120 deletions(-) create mode 100644 app/Http/Controllers/AccessLogController.php create mode 100644 app/Http/Controllers/HasilBelajarController.php create mode 100644 app/Http/Controllers/SiswaController.php rename database/migrations/{2019_05_14_080332_add_url_field_to_access_logs_table.php => 2019_05_15_020128_add_src_field_to_access_logs_table.php} (72%) diff --git a/app/AccessLog.php b/app/AccessLog.php index 3dc7aa9..fac5778 100644 --- a/app/AccessLog.php +++ b/app/AccessLog.php @@ -10,7 +10,7 @@ class AccessLog extends Model use SoftDeletes; protected $fillable = [ - 'siswa_id', + 'siswa_id', 'src', ]; protected $with = [ 'siswa' ]; diff --git a/app/HasilBelajar.php b/app/HasilBelajar.php index 681c68d..d875fe7 100644 --- a/app/HasilBelajar.php +++ b/app/HasilBelajar.php @@ -21,4 +21,9 @@ class HasilBelajar extends Model protected $dispatchesEvents = [ 'saved' => HasilBelajarImported::class, ]; + + public function siswa() + { + return $this->belongsTo('App\Siswa'); + } } diff --git a/app/Http/Controllers/AccessLogController.php b/app/Http/Controllers/AccessLogController.php new file mode 100644 index 0000000..9d497f2 --- /dev/null +++ b/app/Http/Controllers/AccessLogController.php @@ -0,0 +1,41 @@ +select(DB::raw('count(*) as num')) + ->where('src', $request->src) + ->groupBy('siswa_id') + ->get() + ->count(); + + /* + * Count the total number of siswa + * + */ + $resources = Siswa::count(); + + return response()->json([ + 'accessed' => $logs, + 'total' => $resources, + ]); + } +} diff --git a/app/Http/Controllers/HasilBelajarController.php b/app/Http/Controllers/HasilBelajarController.php new file mode 100644 index 0000000..69a483f --- /dev/null +++ b/app/Http/Controllers/HasilBelajarController.php @@ -0,0 +1,63 @@ +all(), [ + 'nisn' => 'required|regex:/^[0-9]+$/', + 'tanggalLahir' => 'required|regex:/^[0-9]+$/', + ], [ + 'required' => 'Kolom :attribute harus diisi.', + 'regex' => 'Kolom :attribute tidak sesuai.', + ])->validate(); + + /* + * Look for the given inputs in the resource + * + */ + try { + $tanggalLahir = Carbon::parse($request->tanggalLahir)->format('Y-m-d'); + } catch(Exception $e) { + return response()->json([ + 'message' => 'The given data was invalid.', + 'errors' => [ + 'tanggalLahir' => ['Kolom tanggal lahir tidak sesuai.'], + ] + ], 422); + } + $siswa = Siswa::where('nisn', $request->nisn) + ->where('tanggal_lahir', $tanggalLahir) + ->with('hasilBelajar') + ->first(); + + /* + * Redirect with error if not found + * + */ + if (!$siswa || $siswa == null) { + return response()->json(['errors' => ['siswa' => ['Siswa tidak ditemukan.']]], 404); + } + + return $siswa; + } +} diff --git a/app/Http/Controllers/SiswaController.php b/app/Http/Controllers/SiswaController.php new file mode 100644 index 0000000..ec07452 --- /dev/null +++ b/app/Http/Controllers/SiswaController.php @@ -0,0 +1,69 @@ +all(), [ + 'nisn' => 'required|regex:/^[0-9]+$/', + 'tanggalLahir' => 'required|regex:/^[0-9]+$/', + ], [ + 'required' => 'Kolom :attribute harus diisi.', + 'regex' => 'Kolom :attribute tidak sesuai.', + ])->validate(); + + /* + * Look for the given inputs in the resource + * + */ + try { + $tanggalLahir = Carbon::parse($request->tanggalLahir)->format('Y-m-d'); + } catch(Exception $e) { + return response()->json([ + 'message' => 'The given data was invalid.', + 'errors' => [ + 'tanggalLahir' => ['Kolom tanggal lahir tidak sesuai.'], + ] + ], 422); + } + + $siswa = Siswa::where('nisn', $request->nisn) + ->where('tanggal_lahir', $tanggalLahir) + ->with($request->with) + ->first(); + + /* + * Redirect with error if not found + * + */ + if (!$siswa || $siswa == null) { + return response()->json(['errors' => ['siswa' => ['Siswa tidak ditemukan.']]], 404); + } + + /* + * Write a new access log + * + */ + AccessLog::create(['siswa_id' => $siswa->id, 'src' => $request->src]); + + return $siswa; + } +} diff --git a/app/Siswa.php b/app/Siswa.php index acf6fc3..66e1a9e 100644 --- a/app/Siswa.php +++ b/app/Siswa.php @@ -21,4 +21,9 @@ class Siswa extends Model 'tanggal_lahir' => 'datetime:Y-m-d', 'lulus' => 'boolean', ]; + + public function hasilBelajar() + { + return $this->hasOne('App\HasilBelajar'); + } } diff --git a/database/migrations/2019_05_14_080332_add_url_field_to_access_logs_table.php b/database/migrations/2019_05_15_020128_add_src_field_to_access_logs_table.php similarity index 72% rename from database/migrations/2019_05_14_080332_add_url_field_to_access_logs_table.php rename to database/migrations/2019_05_15_020128_add_src_field_to_access_logs_table.php index 6759d74..46f4a93 100644 --- a/database/migrations/2019_05_14_080332_add_url_field_to_access_logs_table.php +++ b/database/migrations/2019_05_15_020128_add_src_field_to_access_logs_table.php @@ -4,7 +4,7 @@ use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; -class AddUrlFieldToAccessLogsTable extends Migration +class AddSrcFieldToAccessLogsTable extends Migration { /** * Run the migrations. @@ -14,10 +14,10 @@ class AddUrlFieldToAccessLogsTable extends Migration public function up() { Schema::table('access_logs', function (Blueprint $table) { - $table->string('url'); + $table->string('src'); }); - DB::table('access_logs')->update(['url' => '/api/siswa']); + DB::table('access_logs')->update(['src' => 'surat-kelulusan']); } /** @@ -28,7 +28,7 @@ class AddUrlFieldToAccessLogsTable extends Migration public function down() { Schema::table('access_logs', function (Blueprint $table) { - $table->dropColumn('url'); + $table->dropColumn('src'); }); } } diff --git a/package-lock.json b/package-lock.json index 6c5f3e0..0a09895 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5342,6 +5342,11 @@ "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=" }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", diff --git a/package.json b/package.json index 94b1c25..1020dca 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "test": "tests" }, "dependencies": { - "lodash.isempty": "^4.4.0" + "lodash.isempty": "^4.4.0", + "lodash.map": "^4.6.0" }, "devDependencies": { "cross-env": "^5.2.0", diff --git a/public/css/main.css b/public/css/main.css index 95dc34d..48a4d0b 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -7656,6 +7656,15 @@ span.error { display: table-cell; } +.letter table.nilai tbody.counter { + counter-reset: nomor; +} + +.letter table.nilai tbody.counter td:first-child::before { + counter-increment: nomor; + content: counter(nomor) "."; +} + .letter table.signature { width: auto; margin-left: auto; @@ -7805,6 +7814,14 @@ span.error { .letter .letter__body-header { font-size: 14px; } + + .letter table.nilai .long { + display: table-cell; + } + + .letter table.nilai .short { + display: none; + } } @media (min-width: 640px) { diff --git a/public/js/app.js b/public/js/app.js index 312dc35..32cde89 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -680,6 +680,2384 @@ module.exports = isEmpty; /***/ }), +/***/ "./node_modules/lodash.map/index.js": +/*!******************************************!*\ + !*** ./node_modules/lodash.map/index.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global, module) {/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used to compose bitmasks for comparison styles. */ +var UNORDERED_COMPARE_FLAG = 1, + PARTIAL_COMPARE_FLAG = 2; + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + reLeadingDot = /^\./, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag] = +typedArrayTags[weakMapTag] = false; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** Detect free variable `exports`. */ +var freeExports = true && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Detect free variable `process` from Node.js. */ +var freeProcess = moduleExports && freeGlobal.process; + +/** Used to access faster Node.js helpers. */ +var nodeUtil = (function() { + try { + return freeProcess && freeProcess.binding('util'); + } catch (e) {} +}()); + +/* Node.js helper references. */ +var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + +/** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function arrayMap(array, iteratee) { + var index = -1, + length = array ? array.length : 0, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; +} + +/** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array ? array.length : 0; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; +} + +/** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ +function baseUnary(func) { + return function(value) { + return func(value); + }; +} + +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +/** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ +function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; +} + +/** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ +function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; +} + +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +/** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ +function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; +} + +/** Used for built-in method references. */ +var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** Built-in value references. */ +var Symbol = root.Symbol, + Uint8Array = root.Uint8Array, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeKeys = overArg(Object.keys, Object); + +/* Built-in method references that are verified to be native. */ +var DataView = getNative(root, 'DataView'), + Map = getNative(root, 'Map'), + Promise = getNative(root, 'Promise'), + Set = getNative(root, 'Set'), + WeakMap = getNative(root, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + +/** Used to detect maps, sets, and weakmaps. */ +var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; +} + +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + return this.has(key) && delete this.__data__[key]; +} + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); +} + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; +} + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + return true; +} + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; +} + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + return getMapData(this, key)['delete'](key); +} + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); +} + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); +} + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + getMapData(this, key).set(key, value); + return this; +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +/** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ +function SetCache(values) { + var index = -1, + length = values ? values.length : 0; + + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } +} + +/** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ +function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; +} + +/** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ +function setCacheHas(value) { + return this.__data__.has(value); +} + +// Add methods to `SetCache`. +SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; +SetCache.prototype.has = setCacheHas; + +/** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Stack(entries) { + this.__data__ = new ListCache(entries); +} + +/** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ +function stackClear() { + this.__data__ = new ListCache; +} + +/** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function stackDelete(key) { + return this.__data__['delete'](key); +} + +/** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function stackGet(key) { + return this.__data__.get(key); +} + +/** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function stackHas(key) { + return this.__data__.has(key); +} + +/** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ +function stackSet(key, value) { + var cache = this.__data__; + if (cache instanceof ListCache) { + var pairs = cache.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + return this; + } + cache = this.__data__ = new MapCache(pairs); + } + cache.set(key, value); + return this; +} + +// Add methods to `Stack`. +Stack.prototype.clear = stackClear; +Stack.prototype['delete'] = stackDelete; +Stack.prototype.get = stackGet; +Stack.prototype.has = stackHas; +Stack.prototype.set = stackSet; + +/** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ +function arrayLikeKeys(value, inherited) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + // Safari 9 makes `arguments.length` enumerable in strict mode. + var result = (isArray(value) || isArguments(value)) + ? baseTimes(value.length, String) + : []; + + var length = result.length, + skipIndexes = !!length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && (key == 'length' || isIndex(key, length)))) { + result.push(key); + } + } + return result; +} + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; +} + +/** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ +var baseEach = createBaseEach(baseForOwn); + +/** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = createBaseFor(); + +/** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); +} + +/** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path) { + path = isKey(path, object) ? [path] : castPath(path); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; +} + +/** + * The base implementation of `getTag`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + return objectToString.call(value); +} + +/** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ +function baseHasIn(object, key) { + return object != null && key in Object(object); +} + +/** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @param {boolean} [bitmask] The bitmask of comparison flags. + * The bitmask may be composed of the following flags: + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, customizer, bitmask, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack); +} + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparisons. + * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` + * for more details. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = arrayTag, + othTag = arrayTag; + + if (!objIsArr) { + objTag = getTag(object); + objTag = objTag == argsTag ? objectTag : objTag; + } + if (!othIsArr) { + othTag = getTag(other); + othTag = othTag == argsTag ? objectTag : othTag; + } + var objIsObj = objTag == objectTag && !isHostObject(object), + othIsObj = othTag == objectTag && !isHostObject(other), + isSameTag = objTag == othTag; + + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, equalFunc, customizer, bitmask, stack) + : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack); + } + if (!(bitmask & PARTIAL_COMPARE_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, equalFunc, customizer, bitmask, stack); +} + +/** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) + : result + )) { + return false; + } + } + } + return true; +} + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +/** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ +function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[objectToString.call(value)]; +} + +/** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ +function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); +} + +/** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; +} + +/** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; +} + +/** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; +} + +/** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG); + }; +} + +/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; +} + +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value) { + return isArray(value) ? value : stringToPath(value); +} + +/** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} + +/** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} customizer The function to customize comparisons. + * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` + * for more details. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { + var isPartial = bitmask & PARTIAL_COMPARE_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(array); + if (stacked && stack.get(other)) { + return stacked == other; + } + var index = -1, + result = true, + seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!seen.has(othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { + return seen.add(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, customizer, bitmask, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; +} + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} customizer The function to customize comparisons. + * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` + * for more details. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = mapToArray; + + case setTag: + var isPartial = bitmask & PARTIAL_COMPARE_FLAG; + convert || (convert = setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= UNORDERED_COMPARE_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; +} + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} customizer The function to customize comparisons. + * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual` + * for more details. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, equalFunc, customizer, bitmask, stack) { + var isPartial = bitmask & PARTIAL_COMPARE_FLAG, + objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked && stack.get(other)) { + return stacked == other; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; +} + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +/** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = keys(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, isStrictComparable(value)]; + } + return result; +} + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +/** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +var getTag = baseGetTag; + +// Fallback for data views, maps, sets, and weak maps in IE 11, +// for data views in Edge < 14, and promises in Node.js. +if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = objectToString.call(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : undefined; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; +} + +/** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ +function hasPath(object, path, hasFunc) { + path = isKey(path, object) ? [path] : castPath(path); + + var result, + index = -1, + length = path.length; + + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result) { + return result; + } + var length = object ? object.length : 0; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); +} + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && + (typeof value == 'number' || reIsUint.test(value)) && + (value > -1 && value % 1 == 0 && value < length); +} + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); +} + +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; +} + +/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !isObject(value); +} + +/** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; +} + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +var stringToPath = memoize(function(string) { + string = toString(string); + + var result = []; + if (reLeadingDot.test(string)) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +}); + +/** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ +function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +/** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ +function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, baseIteratee(iteratee, 3)); +} + +/** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result); + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; +} + +// Assign cache to `_.memoize`. +memoize.Cache = MapCache; + +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && + (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); +} + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} + +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && objectToString.call(value) == symbolTag); +} + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + +/** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {string} Returns the string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ +function toString(value) { + return value == null ? '' : baseToString(value); +} + +/** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; +} + +/** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ +function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); +} + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); +} + +/** + * This method returns the first argument it receives. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true + */ +function identity(value) { + return value; +} + +/** + * Creates a function that returns the value at `path` of a given object. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + * @example + * + * var objects = [ + * { 'a': { 'b': 2 } }, + * { 'a': { 'b': 1 } } + * ]; + * + * _.map(objects, _.property('a.b')); + * // => [2, 1] + * + * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); + * // => [1, 2] + */ +function property(path) { + return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); +} + +module.exports = map; + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module))) + +/***/ }), + /***/ "./node_modules/mithril/mithril.mjs": /*!******************************************!*\ !*** ./node_modules/mithril/mithril.mjs ***! @@ -2387,26 +4765,81 @@ mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route(document.body.querySelecto "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var mithril__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mithril */ "./node_modules/mithril/mithril.mjs"); +/* harmony import */ var lodash_isempty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.isempty */ "./node_modules/lodash.isempty/index.js"); +/* harmony import */ var lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isempty__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var lodash_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.map */ "./node_modules/lodash.map/index.js"); +/* harmony import */ var lodash_map__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_map__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _models_Siswa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/Siswa */ "./resources/js/models/Siswa.js"); +/* harmony import */ var _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/AccessLog */ "./resources/js/models/AccessLog.js"); +/* + * TODO + * + * - Buat pesan error print + */ + + + + var component = { + oninit: function oninit() { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); + }, + namaMapel: { + 'agama': 'Pendidikan Agama', + 'pkn': 'Pendidikan Kewarganegaraan', + 'indo': 'Bahasa Indonesia', + 'penjas': 'Pendidikan Jasmani dan Kesehatan', + 'senbud': 'Seni Budaya', + 'mtk': 'Matematika', + 'inggris': 'Bahasa Inggris', + 'ipa': 'Ilmu Pengetahuan Alam', + 'ips': 'Ilmu Pengetahuan Sosial', + 'fisika': 'Fisika', + 'kimia': 'Kimia', + 'kwh': 'Kewirausahaan', + 'kkpi': 'Keterampilan Komputer dan Pengelolaan Informasi', + 'dkk': 'Dasar Kompetensi Keahlian', + 'kk': 'Kompetensi Keahlian', + 'mandarin': 'Bahasa Mandarin', + 'kbi': 'Korespondensi Bahasa Inggris', + 'pap': 'Praktek Administrasi Perkantoran', + 'myob': 'MYOB' + }, + rataRata: { + raport: [], + usbn: [], + unbk: [] + }, view: function view() { - return [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.italic.text-xs', ['Saat ini sudah ', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong', [//AccessLog.current.accessed, - ' / ']), ' siswa yang telah melihat pengumuman kelulusan.']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('form.form', { + component.rataRata = { + raport: [], + usbn: [], + unbk: [] + }; + return [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.italic.text-xs', ['Saat ini sudah ', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong', [_models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].current.accessed, ' / ', _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].current.total]), ' siswa yang telah melihat surat keterangan hasil belajar.']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('form.form', { onsubmit: function onsubmit(e) { - e.preventDefault(); //Siswa.cariData({ - //nisn: e.target.elements.nisn.value, - //tanggalLahir: e.target.elements.tanggalLahir.value, - //}); + e.preventDefault(); + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].cariData({ + nisn: e.target.elements.nisn.value, + tanggalLahir: e.target.elements.tanggalLahir.value, + src: 'sk-hasil-belajar', + "with": 'hasilBelajar' + }); } - }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [//!_isEmpty(Siswa.error) ? - //Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') - //: Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') - //: '' : '', - 'Nomor Induk Siswa Nasional.'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [//!_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', - 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), //m(!_isEmpty(Siswa.current) ? '.letter' : '.letter.hidden', [ - Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { + }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn[0] + ' ') : '' : '', 'Nomor Induk Siswa Nasional.'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir[0] + ' ') : '', 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { onclick: function onclick() { - window.print(); + if (confirm('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?')) { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].create({ + siswaId: _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.id, + src: 'sk-hasil-belajar' + }).then(function () { + window.print(); + })["catch"](function (e) { + //AccessLog.error = JSON.parse(e.message); + console.log(e, e.message, e.code, e.response); + }); + } } }, [mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust('⎙'), ' Print']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('img[src=img/letter-head.jpg]')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('', { style: { @@ -2427,11 +4860,37 @@ var component = { backgroundColor: '#000', marginBottom: '1rem' } - }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__body', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong.letter__body-header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('u', 'SURAT KETERANGAN')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.font-normal', 'Nomor: 077/SMK-BA/V/2019')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('br'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Yang bertanda tangan di bawah ini :')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Drs. Engkos Kosasih, M.M.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Jabatan'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Kepala Sekolah')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Asal Sekolah'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'SMK Bhakti Anindya')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Menerangkan bahwa')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'A\'AN SAPUTRA')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tempat / Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'SAMARINDA'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', ', 22 JANUARI 2001')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'NIS / NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', '1166189'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', '/ 0013312008')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nomor Peserta'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', '4-19-30-02-059-001-8')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kelas'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'XII TKJ 1')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Bidang Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Teknologi Informasi dan Komunikasi')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Program Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Teknik Komputer dan Informatika')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kompetensi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Teknik Komputer dan Jaringan')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Adalah benar siswa SMK Bhakti Anindya, Kota Tangerang dan pada tanggal 13 Mei 2019 telah dinyatakan lulus')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Berikut hasil belajar siswa tersebut :')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table.nilai', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', { + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__body', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong.letter__body-header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.border-b.border-black', 'SURAT KETERANGAN')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.font-normal.mt-1', 'Nomor: 077/SMK-BA/V/2019')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('br'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Yang bertanda tangan di bawah ini :')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Drs. Engkos Kosasih, M.M.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Jabatan'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Kepala Sekolah')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Asal Sekolah'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'SMK Bhakti Anindya')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Menerangkan bahwa')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.nama)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tempat / Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.tempat_lahir + ' , ' + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.tanggal_lahir)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'NIS / NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.nis + ' / ' + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.nisn)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nomor Peserta'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.nopes)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kelas'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.kelas)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Bidang Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.bsk)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Program Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.psk)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kompetensi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.kk)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Adalah benar siswa SMK Bhakti Anindya, Kota Tangerang dan pada tanggal 13 Mei 2019 telah dinyatakan lulus')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Berikut hasil belajar siswa tersebut :')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table.nilai', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', { style: { width: '5%' } - }, 'No.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=2]', 'Mata Pelajaran'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Rata-rata Raport Semester 1-6'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'Raport'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Ujian Sekolah Berstandar Nasional'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'USBN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Ujian Nasional Berbasis Komputer'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'UNBK')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Normatif')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right', '1.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', 'Pendidikan Agama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=3]', 'Rata-rata'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', 'xx.xx')])]))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Demikian Surat Keterangan ini dibuat untuk siswa yang bersangkutan melanjutkan ke jenjang yang lebih tinggi.'))]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table.signature', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tangerang, 13 Mei 2019')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kepala Sekolah,')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__sign', { + }, 'No.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=2]', 'Mata Pelajaran'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Rata-rata Raport Semester 1-6'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'Raport'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Ujian Sekolah Berstandar Nasional'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'USBN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Ujian Nasional Berbasis Komputer'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'UNBK')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Normatif')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.normatif, function (nilai, mapel) { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); + })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Adaptif')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.adaptif, function (nilai, mapel) { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Produktif')])), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.produktif, function (nilai, mapel) { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); + })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Mulok')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.mulok, function (nilai, mapel) { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); + })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=3]', 'Rata-rata'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', (component.rataRata.raport.reduce(function (total, num) { + return total + num; + }) / component.rataRata.raport.length).toFixed(2)), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', (component.rataRata.usbn.reduce(function (total, num) { + return total + num; + }) / component.rataRata.usbn.length).toFixed(2)), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', (component.rataRata.unbk.reduce(function (total, num) { + return total + num; + }) / component.rataRata.unbk.length).toFixed(2))])]))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Demikian Surat Keterangan ini dibuat untuk siswa yang bersangkutan melanjutkan ke jenjang yang lebih tinggi.'))]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table.signature', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tangerang, 13 Mei 2019')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kepala Sekolah,')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__sign', { style: { height: '3rem' } @@ -2462,7 +4921,7 @@ __webpack_require__.r(__webpack_exports__); var component = { oninit: function oninit() { - _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].fetch(); + _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].fetch('surat-kelulusan'); }, view: function view() { return [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.italic.text-xs', ['Saat ini sudah ', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong', [_models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].current.accessed, ' / ', _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].current.total]), ' siswa yang telah melihat pengumuman kelulusan.']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('h1.title', 'Pengumuman Kelulusan SMK Bhakti Anindya'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('form.form', { @@ -2470,7 +4929,8 @@ var component = { e.preventDefault(); _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].cariData({ nisn: e.target.elements.nisn.value, - tanggalLahir: e.target.elements.tanggalLahir.value + tanggalLahir: e.target.elements.tanggalLahir.value, + src: 'surat-kelulusan' }); } }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.nisn[0] + ' ') : '' : '', 'Nomor Induk Siswa Nasional.'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.tanggalLahir[0] + ' ') : '', 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])(!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current) ? '.letter' : '.letter.hidden', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { @@ -2516,10 +4976,22 @@ __webpack_require__.r(__webpack_exports__); var model = { current: {}, - fetch: function fetch() { - mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ + fetch: function fetch(src) { + return mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ method: 'get', - url: '/api/access_log' + url: '/api/access_log', + data: { + src: src + } + }).then(function (response) { + model.current = response; + }); + }, + create: function create(data) { + return mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ + method: 'post', + url: '/api/access_log', + data: data }).then(function (response) { model.current = response; }); @@ -2553,7 +5025,7 @@ var model = { data: data }).then(function (response) { model.current = response; - _AccessLog__WEBPACK_IMPORTED_MODULE_1__["default"].fetch(); + _AccessLog__WEBPACK_IMPORTED_MODULE_1__["default"].fetch('surat-kelulusan'); })["catch"](function (e) { model.error = JSON.parse(e.message); }); diff --git a/resources/js/components/SKHasilBelajar.js b/resources/js/components/SKHasilBelajar.js index 6e4eb59..b83930b 100644 --- a/resources/js/components/SKHasilBelajar.js +++ b/resources/js/components/SKHasilBelajar.js @@ -1,17 +1,61 @@ +/* + * TODO + * + * - Buat pesan error print + */ + import m from "mithril" +import _isEmpty from "lodash.isempty" +import _map from "lodash.map" +import Siswa from "../models/Siswa" +import AccessLog from "../models/AccessLog" var component = { + oninit: () => { + AccessLog.fetch('sk-hasil-belajar'); + }, + namaMapel: { + 'agama': 'Pendidikan Agama', + 'pkn': 'Pendidikan Kewarganegaraan', + 'indo': 'Bahasa Indonesia', + 'penjas': 'Pendidikan Jasmani dan Kesehatan', + 'senbud': 'Seni Budaya', + 'mtk': 'Matematika', + 'inggris': 'Bahasa Inggris', + 'ipa': 'Ilmu Pengetahuan Alam', + 'ips': 'Ilmu Pengetahuan Sosial', + 'fisika': 'Fisika', + 'kimia': 'Kimia', + 'kwh': 'Kewirausahaan', + 'kkpi': 'Keterampilan Komputer dan Pengelolaan Informasi', + 'dkk': 'Dasar Kompetensi Keahlian', + 'kk': 'Kompetensi Keahlian', + 'mandarin': 'Bahasa Mandarin', + 'kbi': 'Korespondensi Bahasa Inggris', + 'pap': 'Praktek Administrasi Perkantoran', + 'myob': 'MYOB', + }, + rataRata: { + raport: [], + usbn: [], + unbk: [], + }, view: () => { + component.rataRata = { + raport: [], + usbn: [], + unbk: [], + }; return [ m('.header', [ m('span.italic.text-xs', [ 'Saat ini sudah ', m('strong', [ - //AccessLog.current.accessed, + AccessLog.current.accessed, ' / ', - //AccessLog.current.total, + AccessLog.current.total, ]), - ' siswa yang telah melihat pengumuman kelulusan.' + ' siswa yang telah melihat surat keterangan hasil belajar.' ]), m('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), m('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.'), @@ -19,11 +63,12 @@ var component = { m('form.form', { onsubmit: e => { e.preventDefault(); - //Siswa.cariData({ - //nisn: e.target.elements.nisn.value, - //tanggalLahir: e.target.elements.tanggalLahir.value, - //src: 'sk-hasil-belajar', - //}); + Siswa.cariData({ + nisn: e.target.elements.nisn.value, + tanggalLahir: e.target.elements.tanggalLahir.value, + src: 'sk-hasil-belajar', + with: 'hasilBelajar', + }); } }, m('.form-grid', [ @@ -31,10 +76,10 @@ var component = { m('label.form-label[for=input-nisn]', 'NISN'), m('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), m('p.input-helper', [ - //!_isEmpty(Siswa.error) ? - //Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') - //: Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') - //: '' : '', + !_isEmpty(Siswa.error) ? + Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') + : Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') + : '' : '', 'Nomor Induk Siswa Nasional.', ]), ]), @@ -42,18 +87,25 @@ var component = { m('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), m('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), m('p.input-helper', [ - //!_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', + !_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529', ]), ]), m('button.form-submit#input-submit[type=submit]', 'Lihat'), ])), - //m(!_isEmpty(Siswa.current) ? '.letter' : '.letter.hidden', [ - m('.letter', [ + _isEmpty(Siswa.current) ? null : m('.letter', [ m('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), m('button.print-button', { onclick: () => { - window.print(); + if (confirm('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?')) { + AccessLog.create({siswaId: Siswa.current.id, src: 'sk-hasil-belajar'}).then(() => { + window.print(); + }) + .catch(e => { + //AccessLog.error = JSON.parse(e.message); + console.log(e, e.message, e.code, e.response); + }); + } } }, [ m.trust('⎙'), @@ -83,8 +135,8 @@ var component = { }}), m('.letter__body', [ m('strong.letter__body-header', [ - m('p', m('u', 'SURAT KETERANGAN')), - m('p.font-normal', 'Nomor: 077/SMK-BA/V/2019'), + m('p', m('span.border-b.border-black', 'SURAT KETERANGAN')), + m('p.font-normal.mt-1', 'Nomor: 077/SMK-BA/V/2019'), ]), m('br'), m('table', [ @@ -120,51 +172,49 @@ var component = { m('td'), m('td', 'Nama'), m('td', ':'), - m('td[colspan=3]', 'A\'AN SAPUTRA'), + m('td[colspan=3]', Siswa.current.nama), ]), m('tr', [ m('td'), m('td', 'Tempat / Tanggal Lahir'), m('td', ':'), - m('td', 'SAMARINDA'), - m('td[colspan=2]', ', 22 JANUARI 2001'), + m('td', Siswa.current.tempat_lahir + ' , ' + Siswa.current.tanggal_lahir), ]), m('tr', [ m('td'), m('td', 'NIS / NISN'), m('td', ':'), - m('td', '1166189'), - m('td[colspan=2]', '/ 0013312008'), + m('td', Siswa.current.nis + ' / ' + Siswa.current.nisn), ]), m('tr', [ m('td'), m('td', 'Nomor Peserta'), m('td', ':'), - m('td[colspan=3]', '4-19-30-02-059-001-8'), + m('td[colspan=3]', Siswa.current.nopes), ]), m('tr', [ m('td'), m('td', 'Kelas'), m('td', ':'), - m('td[colspan=3]', 'XII TKJ 1'), + m('td[colspan=3]', Siswa.current.kelas), ]), m('tr', [ m('td'), m('td', 'Bidang Studi Keahlian'), m('td', ':'), - m('td[colspan=3]', 'Teknologi Informasi dan Komunikasi'), + m('td[colspan=3]', Siswa.current.bsk), ]), m('tr', [ m('td'), m('td', 'Program Studi Keahlian'), m('td', ':'), - m('td[colspan=3]', 'Teknik Komputer dan Informatika'), + m('td[colspan=3]', Siswa.current.psk), ]), m('tr', [ m('td'), m('td', 'Kompetensi Keahlian'), m('td', ':'), - m('td[colspan=3]', 'Teknik Komputer dan Jaringan'), + m('td[colspan=3]', Siswa.current.kk), ]), m('tr', m('td', @@ -193,18 +243,75 @@ var component = { m('th', 'A.'), m('th[colspan=5].text-left', 'Normatif'), ]), + m('tbody.counter', + _map(Siswa.current.hasil_belajar.meta.normatif, (nilai, mapel) => { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : m('tr', [ + m('td.text-right'), + m('td[colspan=2]', component.namaMapel[mapel]), + m('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), + m('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), + m('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null), + ]); + })), m('tr', [ - m('td.text-right', '1.'), - m('td[colspan=2]', 'Pendidikan Agama'), - m('td.text-center', 'xx.xx'), - m('td.text-center', 'xx.xx'), - m('td.text-center', 'xx.xx'), + m('th', 'A.'), + m('th[colspan=5].text-left', 'Adaptif'), ]), + m('tbody.counter', + _map(Siswa.current.hasil_belajar.meta.adaptif, (nilai, mapel) => { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : m('tr', [ + m('td.text-right'), + m('td[colspan=2]', component.namaMapel[mapel]), + m('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), + m('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), + m('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null), + ]); + }), + m('tr', [ + m('th', 'A.'), + m('th[colspan=5].text-left', 'Produktif'), + ])), + m('tbody.counter', + _map(Siswa.current.hasil_belajar.meta.produktif, (nilai, mapel) => { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : m('tr', [ + m('td.text-right'), + m('td[colspan=2]', component.namaMapel[mapel]), + m('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), + m('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), + m('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null), + ]); + })), + m('tr', [ + m('th', 'A.'), + m('th[colspan=5].text-left', 'Mulok'), + ]), + m('tbody.counter', + _map(Siswa.current.hasil_belajar.meta.mulok, (nilai, mapel) => { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : m('tr', [ + m('td.text-right'), + m('td[colspan=2]', component.namaMapel[mapel]), + m('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), + m('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), + m('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null), + ]); + })), m('tr', [ m('th[colspan=3]', 'Rata-rata'), - m('td.text-center', 'xx.xx'), - m('td.text-center', 'xx.xx'), - m('td.text-center', 'xx.xx'), + m('td.text-center', (component.rataRata.raport.reduce((total, num) => total + num) / component.rataRata.raport.length).toFixed(2)), + m('td.text-center', (component.rataRata.usbn.reduce((total, num) => total + num) / component.rataRata.usbn.length).toFixed(2)), + m('td.text-center', (component.rataRata.unbk.reduce((total, num) => total + num) / component.rataRata.unbk.length).toFixed(2)), ]), ]))), m('tr', diff --git a/resources/js/components/SuratKelulusan.js b/resources/js/components/SuratKelulusan.js index 73abeb0..1528fa9 100644 --- a/resources/js/components/SuratKelulusan.js +++ b/resources/js/components/SuratKelulusan.js @@ -5,7 +5,7 @@ import AccessLog from "../models/AccessLog" var component = { oninit: () => { - AccessLog.fetch(); + AccessLog.fetch('surat-kelulusan'); }, view: () => { return [ diff --git a/resources/js/models/AccessLog.js b/resources/js/models/AccessLog.js index 5270ef8..4913fe5 100644 --- a/resources/js/models/AccessLog.js +++ b/resources/js/models/AccessLog.js @@ -3,7 +3,7 @@ import m from "mithril" var model = { current: {}, fetch: src => { - m.request({ + return m.request({ method: 'get', url: '/api/access_log', data: { src }, @@ -12,6 +12,16 @@ var model = { model.current = response; }); }, + create: data => { + return m.request({ + method: 'post', + url: '/api/access_log', + data, + }) + .then(response => { + model.current = response; + }); + }, } export default model; diff --git a/resources/js/models/HasilBelajar.js b/resources/js/models/HasilBelajar.js index 2c023e8..8ba7459 100644 --- a/resources/js/models/HasilBelajar.js +++ b/resources/js/models/HasilBelajar.js @@ -1,4 +1,4 @@ -import m from "mihtril" +import m from "mithril" import AccessLog from "./AccessLog" var model = { @@ -8,12 +8,12 @@ var model = { model.current = {}; m.request({ method: 'post', - url: '/api/hasil-belajar', + url: '/api/hasil_belajar', data, }) .then(response => { model.current = response; - console.log(model.current); + AccessLog.fetch('sk-hasil-belajar'); }) .catch(e => { model.error = JSON.parse(e.message); diff --git a/resources/js/models/Siswa.js b/resources/js/models/Siswa.js index baaded1..6748a75 100644 --- a/resources/js/models/Siswa.js +++ b/resources/js/models/Siswa.js @@ -13,7 +13,7 @@ var model = { }) .then(response => { model.current = response; - AccessLog.fetch(); + AccessLog.fetch('surat-kelulusan'); }) .catch(e => { model.error = JSON.parse(e.message); diff --git a/resources/sass/main.scss b/resources/sass/main.scss index 0585a17..a3300b8 100644 --- a/resources/sass/main.scss +++ b/resources/sass/main.scss @@ -96,6 +96,15 @@ span.error { .short { display: table-cell; } + + tbody.counter { + counter-reset: nomor; + + td:first-child::before { + counter-increment: nomor; + content: counter(nomor) "."; + } + } } table.signature { @@ -207,5 +216,15 @@ span.error { .letter__body-header { font-size: 14px; } + + table.nilai { + .long { + display: table-cell; + } + + .short { + @apply hidden; + } + } } } diff --git a/routes/api.php b/routes/api.php index 662e3b6..bbeefcd 100644 --- a/routes/api.php +++ b/routes/api.php @@ -13,55 +13,16 @@ use Illuminate\Http\Request; | */ -Route::post('/siswa', function (Request $request) { - // Validate user inputs - // Auto redirect on fail - Validator::make($request->all(), [ - 'nisn' => 'required|regex:/^[0-9]+$/', - 'tanggalLahir' => 'required|regex:/^[0-9]+$/', - ], [ - 'required' => 'Kolom :attribute harus diisi.', - 'regex' => 'Kolom :attribute tidak sesuai.', - ])->validate(); +Route::post('/siswa', 'SiswaController')->name('siswa.retrieve'); - // Look for the given inputs in the resource - try { - $tanggalLahir = Carbon\Carbon::parse($request->tanggalLahir)->format('Y-m-d'); - } catch(Exception $e) { - return response()->json([ - 'message' => 'The given data was invalid.', - 'errors' => [ - 'tanggalLahir' => ['Kolom tanggal lahir tidak sesuai.'], - ] - ], 422); - } - $siswa = App\Siswa::where('nisn', $request->nisn) - ->where('tanggal_lahir', $tanggalLahir) - ->first(); +Route::post('/hasil_belajar', 'HasilBelajarController')->name('hasilBelajar.retrieve'); - // Redirect with error if not found - if (!$siswa || $siswa == null) { - return response()->json(['errors' => ['siswa' => ['Siswa tidak ditemukan.']]], 404); - } - - // Write to log - App\AccessLog::create(['siswa_id' => $siswa->id, 'src' => $request->src]); - - return $siswa; -}); - -Route::get('/access_log', function (Request $request) { - // Get the number of unique access - $logs = DB::table('access_logs')->select(DB::raw('count(*) as num where src = ?', $request->src)) - ->groupBy('siswa_id') - ->get() - ->count(); - - // Get the total number of available resource - $resources = App\Siswa::count(); - - return response()->json([ - 'accessed' => $logs, - 'total' => $resources, - ]); -}); +Route::get('/access_log', 'AccessLogController')->name('accessLog.fetch'); +Route::post('/access_log', function(Request $request) { + return response()->json([], 404); + /* + * Write a new access log + * + */ + App\AccessLog::create(['siswa_id' => $request->siswaId, 'src' => $request->src]); +})->name('accessLog.create'); From 30a93871e55410c60dfb4d62957c94943d226873 Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Thu, 16 May 2019 09:30:36 +0700 Subject: [PATCH 05/11] Improved error information to client on both surat-kelulusan and sk-hasil-belajar --- app/Http/Controllers/SiswaController.php | 3 +- public/js/app.js | 47 ++++++++++++++++------- resources/js/components/SKHasilBelajar.js | 29 ++++++++------ resources/js/components/SuratKelulusan.js | 4 +- resources/js/models/AccessLog.js | 13 +++++++ resources/js/models/Siswa.js | 13 ++++++- routes/api.php | 16 +++++--- 7 files changed, 90 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/SiswaController.php b/app/Http/Controllers/SiswaController.php index ec07452..78589d2 100644 --- a/app/Http/Controllers/SiswaController.php +++ b/app/Http/Controllers/SiswaController.php @@ -62,7 +62,8 @@ class SiswaController extends Controller * Write a new access log * */ - AccessLog::create(['siswa_id' => $siswa->id, 'src' => $request->src]); + if ($request->src == 'surat-kelulusan') + AccessLog::create(['siswa_id' => $siswa->id, 'src' => $request->src]); return $siswa; } diff --git a/public/js/app.js b/public/js/app.js index 32cde89..6ccc65e 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -4771,11 +4771,6 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var lodash_map__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_map__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _models_Siswa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/Siswa */ "./resources/js/models/Siswa.js"); /* harmony import */ var _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../models/AccessLog */ "./resources/js/models/AccessLog.js"); -/* - * TODO - * - * - Buat pesan error print - */ @@ -4817,7 +4812,7 @@ var component = { usbn: [], unbk: [] }; - return [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.italic.text-xs', ['Saat ini sudah ', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong', [_models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].current.accessed, ' / ', _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].current.total]), ' siswa yang telah melihat surat keterangan hasil belajar.']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('form.form', { + return [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.italic.text-xs', ['Saat ini sudah ', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong', [_models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].current.accessed, ' / ', _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].current.total]), ' siswa yang telah mencetak surat keterangan hasil belajar.']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('form.form', { onsubmit: function onsubmit(e) { e.preventDefault(); _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].cariData({ @@ -4827,21 +4822,30 @@ var component = { "with": 'hasilBelajar' }); } - }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn[0] + ' ') : '' : '', 'Nomor Induk Siswa Nasional.'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir[0] + ' ') : '', 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { + }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Nomor Induk Siswa Nasional. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn[0] + ' ') : '' : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir[0] + ' ') : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { onclick: function onclick() { if (confirm('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?')) { _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].create({ siswaId: _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.id, src: 'sk-hasil-belajar' }).then(function () { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); window.print(); })["catch"](function (e) { - //AccessLog.error = JSON.parse(e.message); - console.log(e, e.message, e.code, e.response); + if (e.code === 0) { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = { + message: e.message, + errors: { + create: ['Terjadi kesalahan saat menghubungkan ke server.'] + } + }; + } else { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = JSON.parse(e.message); + } }); } } - }, [mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust('⎙'), ' Print']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('img[src=img/letter-head.jpg]')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('', { + }, [mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust('⎙'), ' Print']), !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error) ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error.ml-2', _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error.errors.create[0]) : null, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('img[src=img/letter-head.jpg]')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('', { style: { height: '1px', width: '100%', @@ -4933,7 +4937,7 @@ var component = { src: 'surat-kelulusan' }); } - }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.nisn[0] + ' ') : '' : '', 'Nomor Induk Siswa Nasional.'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', [!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.tanggalLahir[0] + ' ') : '', 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529'])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])(!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current) ? '.letter' : '.letter.hidden', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { + }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Nomor Induk Siswa Nasional. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.nisn[0] + ' ') : '' : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].error.errors.tanggalLahir[0] + ' ') : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])(!lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current) ? '.letter' : '.letter.hidden', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { onclick: function onclick() { window.print(); } @@ -4976,6 +4980,7 @@ __webpack_require__.r(__webpack_exports__); var model = { current: {}, + error: {}, fetch: function fetch(src) { return mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ method: 'get', @@ -4985,6 +4990,15 @@ var model = { } }).then(function (response) { model.current = response; + })["catch"](function (e) { + if (e.code === 0) { + model.error = { + message: e.message, + errors: { + accessLog: ['Terjadi kesalahan saat menghubungkan ke server.'] + } + }; + } else model.error = JSON.parse(e.message); }); }, create: function create(data) { @@ -5025,9 +5039,16 @@ var model = { data: data }).then(function (response) { model.current = response; - _AccessLog__WEBPACK_IMPORTED_MODULE_1__["default"].fetch('surat-kelulusan'); + _AccessLog__WEBPACK_IMPORTED_MODULE_1__["default"].fetch(data.src); })["catch"](function (e) { - model.error = JSON.parse(e.message); + if (e.code === 0) { + model.error = { + message: e.message, + errors: { + siswa: ['Terjadi kesalahan saat menghubungkan ke server.'] + } + }; + } else model.error = JSON.parse(e.message); }); } }; diff --git a/resources/js/components/SKHasilBelajar.js b/resources/js/components/SKHasilBelajar.js index b83930b..2a773ba 100644 --- a/resources/js/components/SKHasilBelajar.js +++ b/resources/js/components/SKHasilBelajar.js @@ -1,9 +1,3 @@ -/* - * TODO - * - * - Buat pesan error print - */ - import m from "mithril" import _isEmpty from "lodash.isempty" import _map from "lodash.map" @@ -55,7 +49,7 @@ var component = { ' / ', AccessLog.current.total, ]), - ' siswa yang telah melihat surat keterangan hasil belajar.' + ' siswa yang telah mencetak surat keterangan hasil belajar.' ]), m('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), m('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.'), @@ -76,19 +70,19 @@ var component = { m('label.form-label[for=input-nisn]', 'NISN'), m('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), m('p.input-helper', [ + 'Nomor Induk Siswa Nasional. ', !_isEmpty(Siswa.error) ? Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') : Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') : '' : '', - 'Nomor Induk Siswa Nasional.', ]), ]), m('.form-group', [ m('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), m('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), m('p.input-helper', [ + 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529. ', !_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', - 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529', ]), ]), m('button.form-submit#input-submit[type=submit]', 'Lihat'), @@ -99,11 +93,21 @@ var component = { onclick: () => { if (confirm('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?')) { AccessLog.create({siswaId: Siswa.current.id, src: 'sk-hasil-belajar'}).then(() => { + AccessLog.fetch('sk-hasil-belajar'); window.print(); }) .catch(e => { - //AccessLog.error = JSON.parse(e.message); - console.log(e, e.message, e.code, e.response); + if (e.code === 0) { + AccessLog.error = { + message: e.message, + errors: { + create: ['Terjadi kesalahan saat menghubungkan ke server.'], + }, + }; + } + else { + AccessLog.error = JSON.parse(e.message); + } }); } } @@ -111,6 +115,9 @@ var component = { m.trust('⎙'), ' Print', ]), + !_isEmpty(AccessLog.error) + ? m('span.error.ml-2', AccessLog.error.errors.create[0]) + : null, m('.letter__header', [ m('img[src=img/letter-head.jpg]'), ]), diff --git a/resources/js/components/SuratKelulusan.js b/resources/js/components/SuratKelulusan.js index 1528fa9..2d852ed 100644 --- a/resources/js/components/SuratKelulusan.js +++ b/resources/js/components/SuratKelulusan.js @@ -37,19 +37,19 @@ var component = { m('label.form-label[for=input-nisn]', 'NISN'), m('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), m('p.input-helper', [ + 'Nomor Induk Siswa Nasional. ', !_isEmpty(Siswa.error) ? Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') : Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') : '' : '', - 'Nomor Induk Siswa Nasional.', ]), ]), m('.form-group', [ m('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), m('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), m('p.input-helper', [ + 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529. ', !_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', - 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529', ]), ]), m('button.form-submit#input-submit[type=submit]', 'Lihat'), diff --git a/resources/js/models/AccessLog.js b/resources/js/models/AccessLog.js index 4913fe5..520db09 100644 --- a/resources/js/models/AccessLog.js +++ b/resources/js/models/AccessLog.js @@ -2,6 +2,7 @@ import m from "mithril" var model = { current: {}, + error: {}, fetch: src => { return m.request({ method: 'get', @@ -10,6 +11,18 @@ var model = { }) .then(response => { model.current = response; + }) + .catch(e => { + if (e.code === 0) { + model.error = { + message: e.message, + errors: { + accessLog: ['Terjadi kesalahan saat menghubungkan ke server.'] + }, + }; + } + else + model.error = JSON.parse(e.message); }); }, create: data => { diff --git a/resources/js/models/Siswa.js b/resources/js/models/Siswa.js index 6748a75..e0dccae 100644 --- a/resources/js/models/Siswa.js +++ b/resources/js/models/Siswa.js @@ -13,10 +13,19 @@ var model = { }) .then(response => { model.current = response; - AccessLog.fetch('surat-kelulusan'); + AccessLog.fetch(data.src); }) .catch(e => { - model.error = JSON.parse(e.message); + if (e.code === 0) { + model.error = { + message: e.message, + errors: { + siswa: ['Terjadi kesalahan saat menghubungkan ke server.'], + }, + }; + } + else + model.error = JSON.parse(e.message); }); }, } diff --git a/routes/api.php b/routes/api.php index bbeefcd..3699d50 100644 --- a/routes/api.php +++ b/routes/api.php @@ -19,10 +19,14 @@ Route::post('/hasil_belajar', 'HasilBelajarController')->name('hasilBelajar.retr Route::get('/access_log', 'AccessLogController')->name('accessLog.fetch'); Route::post('/access_log', function(Request $request) { - return response()->json([], 404); - /* - * Write a new access log - * - */ - App\AccessLog::create(['siswa_id' => $request->siswaId, 'src' => $request->src]); + try { + App\AccessLog::create(['siswa_id' => $request->siswaId, 'src' => $request->src]); + } catch (Exception $e) { + return response()->json([ + 'message' => $e->getMessage(), + 'errors' => [ + 'create' => ['Telah terjadi kesalahan pada server.'], + ], + ], (int)$e->getCode() ?: 500); + } })->name('accessLog.create'); From f8d4d1df98e16107844fd08d8e563aa8aae4ed30 Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Thu, 16 May 2019 09:55:49 +0700 Subject: [PATCH 06/11] sk-hasil-belajar can only be printed once --- app/Siswa.php | 5 ++ public/js/app.js | 23 ++++++++- resources/js/components/SKHasilBelajar.js | 5 +- resources/js/models/AccessLog.js | 61 ++++++++++++++++------- 4 files changed, 71 insertions(+), 23 deletions(-) diff --git a/app/Siswa.php b/app/Siswa.php index 66e1a9e..6af2873 100644 --- a/app/Siswa.php +++ b/app/Siswa.php @@ -22,6 +22,11 @@ class Siswa extends Model 'lulus' => 'boolean', ]; + public function accessLog() + { + return $this->hasMany('App\AccessLog'); + } + public function hasilBelajar() { return $this->hasOne('App\HasilBelajar'); diff --git a/public/js/app.js b/public/js/app.js index 6ccc65e..228112b 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -4819,10 +4819,10 @@ var component = { nisn: e.target.elements.nisn.value, tanggalLahir: e.target.elements.tanggalLahir.value, src: 'sk-hasil-belajar', - "with": 'hasilBelajar' + "with": ['hasilBelajar', 'accessLog'] }); } - }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Nomor Induk Siswa Nasional. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn[0] + ' ') : '' : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir[0] + ' ') : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { + }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Nomor Induk Siswa Nasional. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn[0] + ' ') : '' : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir[0] + ' ') : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.access_log) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { onclick: function onclick() { if (confirm('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?')) { _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].create({ @@ -4982,6 +4982,7 @@ var model = { current: {}, error: {}, fetch: function fetch(src) { + model.current = {}; return mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ method: 'get', url: '/api/access_log', @@ -5009,6 +5010,24 @@ var model = { }).then(function (response) { model.current = response; }); + }, + search: function search(nisn) { + model.current = {}; + mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ + method: 'get', + url: '/api/access_log/' + nisn + }).then(function (response) { + mode.current = response; + })["catch"](function (e) { + if (e.code === 0) { + model.error = { + message: e.message, + errors: { + accessLog: ['Terjadi kesalahan saat menghubungkan ke server.'] + } + }; + } else model.error = JSON.parse(e.message); + }); } }; /* harmony default export */ __webpack_exports__["default"] = (model); diff --git a/resources/js/components/SKHasilBelajar.js b/resources/js/components/SKHasilBelajar.js index 2a773ba..70df8bb 100644 --- a/resources/js/components/SKHasilBelajar.js +++ b/resources/js/components/SKHasilBelajar.js @@ -61,7 +61,7 @@ var component = { nisn: e.target.elements.nisn.value, tanggalLahir: e.target.elements.tanggalLahir.value, src: 'sk-hasil-belajar', - with: 'hasilBelajar', + with: ['hasilBelajar', 'accessLog'], }); } }, @@ -89,7 +89,8 @@ var component = { ])), _isEmpty(Siswa.current) ? null : m('.letter', [ m('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), - m('button.print-button', { + !_isEmpty(Siswa.current.access_log) ? null + : m('button.print-button', { onclick: () => { if (confirm('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?')) { AccessLog.create({siswaId: Siswa.current.id, src: 'sk-hasil-belajar'}).then(() => { diff --git a/resources/js/models/AccessLog.js b/resources/js/models/AccessLog.js index 520db09..32057ee 100644 --- a/resources/js/models/AccessLog.js +++ b/resources/js/models/AccessLog.js @@ -4,26 +4,27 @@ var model = { current: {}, error: {}, fetch: src => { + model.current = {}; return m.request({ method: 'get', url: '/api/access_log', data: { src }, }) - .then(response => { - model.current = response; - }) - .catch(e => { - if (e.code === 0) { - model.error = { - message: e.message, - errors: { - accessLog: ['Terjadi kesalahan saat menghubungkan ke server.'] - }, - }; - } - else - model.error = JSON.parse(e.message); - }); + .then(response => { + model.current = response; + }) + .catch(e => { + if (e.code === 0) { + model.error = { + message: e.message, + errors: { + accessLog: ['Terjadi kesalahan saat menghubungkan ke server.'] + }, + }; + } + else + model.error = JSON.parse(e.message); + }); }, create: data => { return m.request({ @@ -31,10 +32,32 @@ var model = { url: '/api/access_log', data, }) - .then(response => { - model.current = response; - }); + .then(response => { + model.current = response; + }); }, -} + search: nisn => { + model.current = {}; + m.request({ + method: 'get', + url: '/api/access_log/' + nisn, + }) + .then(response => { + mode.current = response; + }) + .catch(e => { + if (e.code === 0) { + model.error = { + message: e.message, + errors: { + accessLog: ['Terjadi kesalahan saat menghubungkan ke server.'] + }, + }; + } + else + model.error = JSON.parse(e.message); + }); + }, +}; export default model; From c4b05cb5254d32d15fff6c1da5fb8e65ec94300f Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Thu, 16 May 2019 12:07:18 +0700 Subject: [PATCH 07/11] sk-hasil-belajar can only be printed once, prevented to be printed multiple times, error texts will be removed on retry --- public/js/app.js | 77 ++++++++++++++++------- resources/js/components/SKHasilBelajar.js | 60 +++++++++++++++++- resources/js/models/AccessLog.js | 24 +------ resources/js/models/HasilBelajar.js | 24 ------- resources/js/models/Siswa.js | 1 + 5 files changed, 114 insertions(+), 72 deletions(-) delete mode 100644 resources/js/models/HasilBelajar.js diff --git a/public/js/app.js b/public/js/app.js index 228112b..e88896a 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -4806,6 +4806,10 @@ var component = { usbn: [], unbk: [] }, + // This prop is to prevent double dialog when printing, + // caused by the print button's confirm() + // and the beforeprint's alert() + confirmPrint: 0, view: function view() { component.rataRata = { raport: [], @@ -4825,6 +4829,7 @@ var component = { }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Nomor Induk Siswa Nasional. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn[0] + ' ') : '' : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir[0] + ' ') : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.access_log) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { onclick: function onclick() { if (confirm('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?')) { + component.confirmPrint = 1; _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].create({ siswaId: _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.id, src: 'sk-hasil-belajar' @@ -4873,17 +4878,17 @@ var component = { if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); - })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Adaptif')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.adaptif, function (nilai, mapel) { + })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'B.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Adaptif')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.adaptif, function (nilai, mapel) { if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); - }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Produktif')])), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.produktif, function (nilai, mapel) { + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'C.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Produktif')])), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.produktif, function (nilai, mapel) { if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); - })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Mulok')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.mulok, function (nilai, mapel) { + })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'D.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Mulok')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.mulok, function (nilai, mapel) { if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); @@ -4900,7 +4905,49 @@ var component = { } }))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Drs. Engkos Kosasih, M.M.'))])])])]; } -}; +}; // Below is to handle Ctrl+P or MouseR->Print + +window.addEventListener("beforeprint", function () { + // If the print button did not exists, show nothing when printing + if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'none';else { + if (!component.confirmPrint) { + alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); + component.confirmPrint = 1; + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].create({ + siswaId: _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.id, + src: 'sk-hasil-belajar' + }).then(function () { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); + })["catch"](function (e) { + if (e.code === 0) { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = { + message: e.message, + errors: { + create: ['Terjadi kesalahan saat menghubungkan ke server.'] + } + }; + } else { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = JSON.parse(e.message); + } + }); + } + } +}); +window.addEventListener("afterprint", function () { + // Give back the whole document.body + if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'block'; // Hide the print button + + if (document.body.querySelector('button.print-button') !== null) document.body.querySelector('button.print-button').style.display = 'none'; // To redraw the content to prevent printing + + var nisn = document.body.querySelector('input[name=nisn]').value, + tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].cariData({ + nisn: nisn, + tanggalLahir: tanggalLahir, + src: 'sk-hasil-belajar', + "with": ['hasilBelajar', 'accessLog'] + }); +}); /* harmony default export */ __webpack_exports__["default"] = (component); /***/ }), @@ -4983,6 +5030,7 @@ var model = { error: {}, fetch: function fetch(src) { model.current = {}; + model.error = {}; return mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ method: 'get', url: '/api/access_log', @@ -5003,6 +5051,7 @@ var model = { }); }, create: function create(data) { + model.error = {}; return mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ method: 'post', url: '/api/access_log', @@ -5010,24 +5059,6 @@ var model = { }).then(function (response) { model.current = response; }); - }, - search: function search(nisn) { - model.current = {}; - mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ - method: 'get', - url: '/api/access_log/' + nisn - }).then(function (response) { - mode.current = response; - })["catch"](function (e) { - if (e.code === 0) { - model.error = { - message: e.message, - errors: { - accessLog: ['Terjadi kesalahan saat menghubungkan ke server.'] - } - }; - } else model.error = JSON.parse(e.message); - }); } }; /* harmony default export */ __webpack_exports__["default"] = (model); @@ -5052,7 +5083,7 @@ var model = { error: {}, cariData: function cariData(data) { model.current = {}; - mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ + model.error = {}, mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ method: 'post', url: '/api/siswa', data: data diff --git a/resources/js/components/SKHasilBelajar.js b/resources/js/components/SKHasilBelajar.js index 70df8bb..4764524 100644 --- a/resources/js/components/SKHasilBelajar.js +++ b/resources/js/components/SKHasilBelajar.js @@ -34,6 +34,10 @@ var component = { usbn: [], unbk: [], }, + // This prop is to prevent double dialog when printing, + // caused by the print button's confirm() + // and the beforeprint's alert() + confirmPrint: 0, view: () => { component.rataRata = { raport: [], @@ -93,6 +97,7 @@ var component = { : m('button.print-button', { onclick: () => { if (confirm('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?')) { + component.confirmPrint = 1; AccessLog.create({siswaId: Siswa.current.id, src: 'sk-hasil-belajar'}).then(() => { AccessLog.fetch('sk-hasil-belajar'); window.print(); @@ -265,7 +270,7 @@ var component = { ]); })), m('tr', [ - m('th', 'A.'), + m('th', 'B.'), m('th[colspan=5].text-left', 'Adaptif'), ]), m('tbody.counter', @@ -282,7 +287,7 @@ var component = { ]); }), m('tr', [ - m('th', 'A.'), + m('th', 'C.'), m('th[colspan=5].text-left', 'Produktif'), ])), m('tbody.counter', @@ -299,7 +304,7 @@ var component = { ]); })), m('tr', [ - m('th', 'A.'), + m('th', 'D.'), m('th[colspan=5].text-left', 'Mulok'), ]), m('tbody.counter', @@ -345,4 +350,53 @@ var component = { }, }; +// Below is to handle Ctrl+P or MouseR->Print +window.addEventListener("beforeprint", function () { + // If the print button did not exists, show nothing when printing + if (document.body.querySelector('button.print-button') === null) + document.body.style.display = 'none'; + else { + if (!component.confirmPrint) { + alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); + component.confirmPrint = 1; + AccessLog.create({siswaId: Siswa.current.id, src: 'sk-hasil-belajar'}).then(() => { + AccessLog.fetch('sk-hasil-belajar'); + }) + .catch(e => { + if (e.code === 0) { + AccessLog.error = { + message: e.message, + errors: { + create: ['Terjadi kesalahan saat menghubungkan ke server.'], + }, + }; + } + else { + AccessLog.error = JSON.parse(e.message); + } + }); + } + } +}); + +window.addEventListener("afterprint", function () { + // Give back the whole document.body + if (document.body.querySelector('button.print-button') === null) + document.body.style.display = 'block'; + + // Hide the print button + if (document.body.querySelector('button.print-button') !== null) + document.body.querySelector('button.print-button').style.display = 'none'; + + // To redraw the content to prevent printing + let nisn = document.body.querySelector('input[name=nisn]').value, + tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; + Siswa.cariData({ + nisn, + tanggalLahir, + src: 'sk-hasil-belajar', + with: ['hasilBelajar', 'accessLog'], + }); +}); + export default component; diff --git a/resources/js/models/AccessLog.js b/resources/js/models/AccessLog.js index 32057ee..be64dde 100644 --- a/resources/js/models/AccessLog.js +++ b/resources/js/models/AccessLog.js @@ -5,6 +5,7 @@ var model = { error: {}, fetch: src => { model.current = {}; + model.error = {}; return m.request({ method: 'get', url: '/api/access_log', @@ -27,6 +28,7 @@ var model = { }); }, create: data => { + model.error = {}; return m.request({ method: 'post', url: '/api/access_log', @@ -36,28 +38,6 @@ var model = { model.current = response; }); }, - search: nisn => { - model.current = {}; - m.request({ - method: 'get', - url: '/api/access_log/' + nisn, - }) - .then(response => { - mode.current = response; - }) - .catch(e => { - if (e.code === 0) { - model.error = { - message: e.message, - errors: { - accessLog: ['Terjadi kesalahan saat menghubungkan ke server.'] - }, - }; - } - else - model.error = JSON.parse(e.message); - }); - }, }; export default model; diff --git a/resources/js/models/HasilBelajar.js b/resources/js/models/HasilBelajar.js deleted file mode 100644 index 8ba7459..0000000 --- a/resources/js/models/HasilBelajar.js +++ /dev/null @@ -1,24 +0,0 @@ -import m from "mithril" -import AccessLog from "./AccessLog" - -var model = { - current: {}, - error: {}, - cariData: data => { - model.current = {}; - m.request({ - method: 'post', - url: '/api/hasil_belajar', - data, - }) - .then(response => { - model.current = response; - AccessLog.fetch('sk-hasil-belajar'); - }) - .catch(e => { - model.error = JSON.parse(e.message); - }); - }, -}; - -export default model; diff --git a/resources/js/models/Siswa.js b/resources/js/models/Siswa.js index e0dccae..490078a 100644 --- a/resources/js/models/Siswa.js +++ b/resources/js/models/Siswa.js @@ -6,6 +6,7 @@ var model = { error: {}, cariData: data => { model.current = {}; + model.error = {}, m.request({ method: 'post', url: '/api/siswa', From ac77c45f304ce8ca119bc37399fd0c76102cf948 Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Thu, 16 May 2019 13:47:48 +0700 Subject: [PATCH 08/11] Fixed conflict between components --- app/Http/Controllers/SiswaController.php | 5 +- public/js/app.js | 97 +++++++++++++---------- resources/js/app.js | 56 +++++++++++++ resources/js/components/SKHasilBelajar.js | 50 +----------- resources/js/components/SuratKelulusan.js | 1 + 5 files changed, 115 insertions(+), 94 deletions(-) diff --git a/app/Http/Controllers/SiswaController.php b/app/Http/Controllers/SiswaController.php index 78589d2..a2cd017 100644 --- a/app/Http/Controllers/SiswaController.php +++ b/app/Http/Controllers/SiswaController.php @@ -47,8 +47,11 @@ class SiswaController extends Controller $siswa = Siswa::where('nisn', $request->nisn) ->where('tanggal_lahir', $tanggalLahir) - ->with($request->with) ->first(); + if ($request->with !== null) + $siswa = $siswa->with($request->with); + + $siswa = $siswa->first(); /* * Redirect with error if not found diff --git a/public/js/app.js b/public/js/app.js index e88896a..1e27c32 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -4744,6 +4744,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var mithril__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mithril */ "./node_modules/mithril/mithril.mjs"); /* harmony import */ var _components_SuratKelulusan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/SuratKelulusan */ "./resources/js/components/SuratKelulusan.js"); /* harmony import */ var _components_SKHasilBelajar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/SKHasilBelajar */ "./resources/js/components/SKHasilBelajar.js"); +/* harmony import */ var _models_Siswa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./models/Siswa */ "./resources/js/models/Siswa.js"); +/* harmony import */ var _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./models/AccessLog */ "./resources/js/models/AccessLog.js"); + + @@ -4751,6 +4755,52 @@ mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.prefix('#'); mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route(document.body.querySelector('.container'), '/', { '/': _components_SuratKelulusan__WEBPACK_IMPORTED_MODULE_1__["default"], '/hasil-belajar': _components_SKHasilBelajar__WEBPACK_IMPORTED_MODULE_2__["default"] +}); // Below is to handle Ctrl+P or MouseR->Print + +window.addEventListener("beforeprint", function () { + if (mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.get() === '/hasil-belajar') { + // If the print button did not exists, show nothing when printing + if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'none';else { + if (!component.confirmPrint) { + alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); + component.confirmPrint = 1; + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].create({ + siswaId: _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.id, + src: 'sk-hasil-belajar' + }).then(function () { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); + })["catch"](function (e) { + if (e.code === 0) { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = { + message: e.message, + errors: { + create: ['Terjadi kesalahan saat menghubungkan ke server.'] + } + }; + } else { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = JSON.parse(e.message); + } + }); + } + } + } +}); +window.addEventListener("afterprint", function () { + if (mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.get() === '/hasil-belajar') { + // Give back the whole document.body + if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'block'; // Hide the print button + + if (document.body.querySelector('button.print-button') !== null) document.body.querySelector('button.print-button').style.display = 'none'; // To redraw the content to prevent printing + + var nisn = document.body.querySelector('input[name=nisn]').value, + tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].cariData({ + nisn: nisn, + tanggalLahir: tanggalLahir, + src: 'sk-hasil-belajar', + "with": ['hasilBelajar', 'accessLog'] + }); + } }); /***/ }), @@ -4778,7 +4828,7 @@ __webpack_require__.r(__webpack_exports__); var component = { oninit: function oninit() { - _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current = {}, _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); }, namaMapel: { 'agama': 'Pendidikan Agama', @@ -4905,49 +4955,7 @@ var component = { } }))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Drs. Engkos Kosasih, M.M.'))])])])]; } -}; // Below is to handle Ctrl+P or MouseR->Print - -window.addEventListener("beforeprint", function () { - // If the print button did not exists, show nothing when printing - if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'none';else { - if (!component.confirmPrint) { - alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); - component.confirmPrint = 1; - _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].create({ - siswaId: _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.id, - src: 'sk-hasil-belajar' - }).then(function () { - _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); - })["catch"](function (e) { - if (e.code === 0) { - _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = { - message: e.message, - errors: { - create: ['Terjadi kesalahan saat menghubungkan ke server.'] - } - }; - } else { - _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = JSON.parse(e.message); - } - }); - } - } -}); -window.addEventListener("afterprint", function () { - // Give back the whole document.body - if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'block'; // Hide the print button - - if (document.body.querySelector('button.print-button') !== null) document.body.querySelector('button.print-button').style.display = 'none'; // To redraw the content to prevent printing - - var nisn = document.body.querySelector('input[name=nisn]').value, - tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; - _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].cariData({ - nisn: nisn, - tanggalLahir: tanggalLahir, - src: 'sk-hasil-belajar', - "with": ['hasilBelajar', 'accessLog'] - }); -}); +}; /* harmony default export */ __webpack_exports__["default"] = (component); /***/ }), @@ -4972,6 +4980,7 @@ __webpack_require__.r(__webpack_exports__); var component = { oninit: function oninit() { + _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current = {}; _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].fetch('surat-kelulusan'); }, view: function view() { diff --git a/resources/js/app.js b/resources/js/app.js index 39784c4..41dd183 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,9 +1,65 @@ import m from "mithril" import SuratKelulusan from "./components/SuratKelulusan" import SKHasilBelajar from "./components/SKHasilBelajar" +import Siswa from "./models/Siswa" +import AccessLog from "./models/AccessLog" m.route.prefix('#'); m.route(document.body.querySelector('.container'), '/', { '/': SuratKelulusan, '/hasil-belajar': SKHasilBelajar, }); + +// Below is to handle Ctrl+P or MouseR->Print +window.addEventListener("beforeprint", function () { + if (m.route.get() === '/hasil-belajar') { + // If the print button did not exists, show nothing when printing + if (document.body.querySelector('button.print-button') === null) + document.body.style.display = 'none'; + else { + if (!component.confirmPrint) { + alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); + component.confirmPrint = 1; + AccessLog.create({siswaId: Siswa.current.id, src: 'sk-hasil-belajar'}).then(() => { + AccessLog.fetch('sk-hasil-belajar'); + }) + .catch(e => { + if (e.code === 0) { + AccessLog.error = { + message: e.message, + errors: { + create: ['Terjadi kesalahan saat menghubungkan ke server.'], + }, + }; + } + else { + AccessLog.error = JSON.parse(e.message); + } + }); + } + } + } +}); + +window.addEventListener("afterprint", function () { + if (m.route.get() === '/hasil-belajar') { + // Give back the whole document.body + if (document.body.querySelector('button.print-button') === null) + document.body.style.display = 'block'; + + // Hide the print button + if (document.body.querySelector('button.print-button') !== null) + document.body.querySelector('button.print-button').style.display = 'none'; + + // To redraw the content to prevent printing + let nisn = document.body.querySelector('input[name=nisn]').value, + tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; + Siswa.cariData({ + nisn, + tanggalLahir, + src: 'sk-hasil-belajar', + with: ['hasilBelajar', 'accessLog'], + }); + } +}); + diff --git a/resources/js/components/SKHasilBelajar.js b/resources/js/components/SKHasilBelajar.js index 4764524..c10891a 100644 --- a/resources/js/components/SKHasilBelajar.js +++ b/resources/js/components/SKHasilBelajar.js @@ -6,6 +6,7 @@ import AccessLog from "../models/AccessLog" var component = { oninit: () => { + Siswa.current = {}, AccessLog.fetch('sk-hasil-belajar'); }, namaMapel: { @@ -350,53 +351,4 @@ var component = { }, }; -// Below is to handle Ctrl+P or MouseR->Print -window.addEventListener("beforeprint", function () { - // If the print button did not exists, show nothing when printing - if (document.body.querySelector('button.print-button') === null) - document.body.style.display = 'none'; - else { - if (!component.confirmPrint) { - alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); - component.confirmPrint = 1; - AccessLog.create({siswaId: Siswa.current.id, src: 'sk-hasil-belajar'}).then(() => { - AccessLog.fetch('sk-hasil-belajar'); - }) - .catch(e => { - if (e.code === 0) { - AccessLog.error = { - message: e.message, - errors: { - create: ['Terjadi kesalahan saat menghubungkan ke server.'], - }, - }; - } - else { - AccessLog.error = JSON.parse(e.message); - } - }); - } - } -}); - -window.addEventListener("afterprint", function () { - // Give back the whole document.body - if (document.body.querySelector('button.print-button') === null) - document.body.style.display = 'block'; - - // Hide the print button - if (document.body.querySelector('button.print-button') !== null) - document.body.querySelector('button.print-button').style.display = 'none'; - - // To redraw the content to prevent printing - let nisn = document.body.querySelector('input[name=nisn]').value, - tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; - Siswa.cariData({ - nisn, - tanggalLahir, - src: 'sk-hasil-belajar', - with: ['hasilBelajar', 'accessLog'], - }); -}); - export default component; diff --git a/resources/js/components/SuratKelulusan.js b/resources/js/components/SuratKelulusan.js index 2d852ed..54a67ce 100644 --- a/resources/js/components/SuratKelulusan.js +++ b/resources/js/components/SuratKelulusan.js @@ -5,6 +5,7 @@ import AccessLog from "../models/AccessLog" var component = { oninit: () => { + Siswa.current = {}; AccessLog.fetch('surat-kelulusan'); }, view: () => { From b2f78ed65681c63fec48db81503c54d464ac9dd7 Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Thu, 16 May 2019 14:33:39 +0700 Subject: [PATCH 09/11] Changed component's page title --- public/js/app.js | 4 +++- resources/js/components/SKHasilBelajar.js | 1 + resources/js/components/SuratKelulusan.js | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/public/js/app.js b/public/js/app.js index 1e27c32..cc7e894 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -4828,6 +4828,7 @@ __webpack_require__.r(__webpack_exports__); var component = { oninit: function oninit() { + document.title = 'Surat Keterangan Hasil Belajar Siswa - SMK Bhakti Anindya'; _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current = {}, _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); }, namaMapel: { @@ -4980,11 +4981,12 @@ __webpack_require__.r(__webpack_exports__); var component = { oninit: function oninit() { + document.title = 'Surat Kelulusan Siswa - SMK Bhakti Anindya'; _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].current = {}; _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].fetch('surat-kelulusan'); }, view: function view() { - return [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.italic.text-xs', ['Saat ini sudah ', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong', [_models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].current.accessed, ' / ', _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].current.total]), ' siswa yang telah melihat pengumuman kelulusan.']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('h1.title', 'Pengumuman Kelulusan SMK Bhakti Anindya'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('form.form', { + return [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.italic.text-xs', ['Saat ini sudah ', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong', [_models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].current.accessed, ' / ', _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].current.total]), ' siswa yang telah melihat pengumuman kelulusan.']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('h1.title', 'Surat Kelulusan Siswa SMK Bhakti Anindya'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('form.form', { onsubmit: function onsubmit(e) { e.preventDefault(); _models_Siswa__WEBPACK_IMPORTED_MODULE_2__["default"].cariData({ diff --git a/resources/js/components/SKHasilBelajar.js b/resources/js/components/SKHasilBelajar.js index c10891a..445cfd0 100644 --- a/resources/js/components/SKHasilBelajar.js +++ b/resources/js/components/SKHasilBelajar.js @@ -6,6 +6,7 @@ import AccessLog from "../models/AccessLog" var component = { oninit: () => { + document.title = 'Surat Keterangan Hasil Belajar Siswa - SMK Bhakti Anindya'; Siswa.current = {}, AccessLog.fetch('sk-hasil-belajar'); }, diff --git a/resources/js/components/SuratKelulusan.js b/resources/js/components/SuratKelulusan.js index 54a67ce..aa6835e 100644 --- a/resources/js/components/SuratKelulusan.js +++ b/resources/js/components/SuratKelulusan.js @@ -5,6 +5,7 @@ import AccessLog from "../models/AccessLog" var component = { oninit: () => { + document.title = 'Surat Kelulusan Siswa - SMK Bhakti Anindya'; Siswa.current = {}; AccessLog.fetch('surat-kelulusan'); }, @@ -20,7 +21,7 @@ var component = { ]), ' siswa yang telah melihat pengumuman kelulusan.' ]), - m('h1.title', 'Pengumuman Kelulusan SMK Bhakti Anindya'), + m('h1.title', 'Surat Kelulusan Siswa SMK Bhakti Anindya'), m('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.'), ]), m('form.form', { From 193a5d3b6ceaa8c1076f4a6e29e3228069e36127 Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Fri, 17 May 2019 12:01:23 +0700 Subject: [PATCH 10/11] Added page to print sk-hasil-belajar freely --- app/Console/Commands/PendopoPassword.php | 43 +++ app/Http/Controllers/SiswaController.php | 3 +- app/Http/Kernel.php | 1 + app/Http/Middleware/IzinMasukPendopo.php | 35 +++ public/js/app.js | 234 ++++++++++++---- resources/js/app.js | 111 ++++---- resources/js/components/Pendopo.js | 318 ++++++++++++++++++++++ resources/js/components/SKHasilBelajar.js | 2 +- resources/views/main.blade.php | 4 +- resources/views/pendopo.blade.php | 21 ++ routes/web.php | 4 + 11 files changed, 670 insertions(+), 106 deletions(-) create mode 100644 app/Console/Commands/PendopoPassword.php create mode 100644 app/Http/Middleware/IzinMasukPendopo.php create mode 100644 resources/js/components/Pendopo.js create mode 100644 resources/views/pendopo.blade.php diff --git a/app/Console/Commands/PendopoPassword.php b/app/Console/Commands/PendopoPassword.php new file mode 100644 index 0000000..58c2b20 --- /dev/null +++ b/app/Console/Commands/PendopoPassword.php @@ -0,0 +1,43 @@ +toDateString().'ba'), 0, 6); + } +} diff --git a/app/Http/Controllers/SiswaController.php b/app/Http/Controllers/SiswaController.php index a2cd017..1fac937 100644 --- a/app/Http/Controllers/SiswaController.php +++ b/app/Http/Controllers/SiswaController.php @@ -46,8 +46,7 @@ class SiswaController extends Controller } $siswa = Siswa::where('nisn', $request->nisn) - ->where('tanggal_lahir', $tanggalLahir) - ->first(); + ->where('tanggal_lahir', $tanggalLahir); if ($request->with !== null) $siswa = $siswa->with($request->with); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index a3d8c48..3041d8b 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -60,6 +60,7 @@ class Kernel extends HttpKernel 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'pendopo' => \App\Http\Middleware\IzinMasukPendopo::class, ]; /** diff --git a/app/Http/Middleware/IzinMasukPendopo.php b/app/Http/Middleware/IzinMasukPendopo.php new file mode 100644 index 0000000..68b49fe --- /dev/null +++ b/app/Http/Middleware/IzinMasukPendopo.php @@ -0,0 +1,35 @@ +toDateString().'ba'), 0, 6); + header('Cache-Control: no-cache, must-revalidate, max-age=0'); + $has_supplied_credentials = !(empty($_SERVER['PHP_AUTH_USER']) && empty($_SERVER['PHP_AUTH_PW'])); + $is_not_authenticated = ( + !$has_supplied_credentials || + $_SERVER['PHP_AUTH_USER'] != $AUTH_USER || + $_SERVER['PHP_AUTH_PW'] != $AUTH_PASS + ); + if ($is_not_authenticated) { + header('HTTP/1.1 401 Authorization Required'); + header('WWW-Authenticate: Basic realm="Access denied"'); + exit; + } + return $next($request); + } +} diff --git a/public/js/app.js b/public/js/app.js index cc7e894..d6034fe 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -4744,64 +4744,201 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var mithril__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mithril */ "./node_modules/mithril/mithril.mjs"); /* harmony import */ var _components_SuratKelulusan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/SuratKelulusan */ "./resources/js/components/SuratKelulusan.js"); /* harmony import */ var _components_SKHasilBelajar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/SKHasilBelajar */ "./resources/js/components/SKHasilBelajar.js"); -/* harmony import */ var _models_Siswa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./models/Siswa */ "./resources/js/models/Siswa.js"); -/* harmony import */ var _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./models/AccessLog */ "./resources/js/models/AccessLog.js"); +/* harmony import */ var _components_Pendopo__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/Pendopo */ "./resources/js/components/Pendopo.js"); +/* harmony import */ var _models_Siswa__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./models/Siswa */ "./resources/js/models/Siswa.js"); +/* harmony import */ var _models_AccessLog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./models/AccessLog */ "./resources/js/models/AccessLog.js"); -mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.prefix('#'); -mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route(document.body.querySelector('.container'), '/', { - '/': _components_SuratKelulusan__WEBPACK_IMPORTED_MODULE_1__["default"], - '/hasil-belajar': _components_SKHasilBelajar__WEBPACK_IMPORTED_MODULE_2__["default"] -}); // Below is to handle Ctrl+P or MouseR->Print -window.addEventListener("beforeprint", function () { - if (mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.get() === '/hasil-belajar') { - // If the print button did not exists, show nothing when printing - if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'none';else { - if (!component.confirmPrint) { - alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); - component.confirmPrint = 1; - _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].create({ - siswaId: _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.id, - src: 'sk-hasil-belajar' - }).then(function () { - _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); - })["catch"](function (e) { - if (e.code === 0) { - _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = { - message: e.message, - errors: { - create: ['Terjadi kesalahan saat menghubungkan ke server.'] - } - }; - } else { - _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].error = JSON.parse(e.message); - } - }); + +if (document.body.querySelector('.container#pendopo') === null) { + mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.prefix('#'); + mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route(document.body.querySelector('.container'), '/', { + '/': _components_SuratKelulusan__WEBPACK_IMPORTED_MODULE_1__["default"], + '/hasil-belajar': _components_SKHasilBelajar__WEBPACK_IMPORTED_MODULE_2__["default"] + }); // Below is to handle Ctrl+P or MouseR->Print + + window.addEventListener("beforeprint", function () { + if (mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.get() === '/hasil-belajar') { + // If the print button did not exists, show nothing when printing + if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'none';else { + if (!component.confirmPrint) { + alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); + component.confirmPrint = 1; + _models_AccessLog__WEBPACK_IMPORTED_MODULE_5__["default"].create({ + siswaId: _models_Siswa__WEBPACK_IMPORTED_MODULE_4__["default"].current.id, + src: 'sk-hasil-belajar' + }).then(function () { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_5__["default"].fetch('sk-hasil-belajar'); + })["catch"](function (e) { + if (e.code === 0) { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_5__["default"].error = { + message: e.message, + errors: { + create: ['Terjadi kesalahan saat menghubungkan ke server.'] + } + }; + } else { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_5__["default"].error = JSON.parse(e.message); + } + }); + } } } - } -}); -window.addEventListener("afterprint", function () { - if (mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.get() === '/hasil-belajar') { - // Give back the whole document.body - if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'block'; // Hide the print button + }); + window.addEventListener("afterprint", function () { + if (mithril__WEBPACK_IMPORTED_MODULE_0__["default"].route.get() === '/hasil-belajar') { + // Give back the whole document.body + if (document.body.querySelector('button.print-button') === null) document.body.style.display = 'block'; // Hide the print button - if (document.body.querySelector('button.print-button') !== null) document.body.querySelector('button.print-button').style.display = 'none'; // To redraw the content to prevent printing + if (document.body.querySelector('button.print-button') !== null) document.body.querySelector('button.print-button').style.display = 'none'; // To redraw the content to prevent printing - var nisn = document.body.querySelector('input[name=nisn]').value, - tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; - _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].cariData({ - nisn: nisn, - tanggalLahir: tanggalLahir, - src: 'sk-hasil-belajar', - "with": ['hasilBelajar', 'accessLog'] - }); + var nisn = document.body.querySelector('input[name=nisn]').value, + tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; + _models_Siswa__WEBPACK_IMPORTED_MODULE_4__["default"].cariData({ + nisn: nisn, + tanggalLahir: tanggalLahir, + src: 'sk-hasil-belajar', + "with": ['hasilBelajar', 'accessLog'] + }); + } + }); +} else { + mithril__WEBPACK_IMPORTED_MODULE_0__["default"].mount(document.body.querySelector('.container#pendopo'), _components_Pendopo__WEBPACK_IMPORTED_MODULE_3__["default"]); +} + +/***/ }), + +/***/ "./resources/js/components/Pendopo.js": +/*!********************************************!*\ + !*** ./resources/js/components/Pendopo.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var mithril__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mithril */ "./node_modules/mithril/mithril.mjs"); +/* harmony import */ var lodash_isempty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.isempty */ "./node_modules/lodash.isempty/index.js"); +/* harmony import */ var lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isempty__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var lodash_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.map */ "./node_modules/lodash.map/index.js"); +/* harmony import */ var lodash_map__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_map__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _models_Siswa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../models/Siswa */ "./resources/js/models/Siswa.js"); + + + + +var component = { + oninit: function oninit() { + document.title = 'Surat Keterangan Hasil Belajar Siswa - SMK Bhakti Anindya'; + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current = {}; + }, + namaMapel: { + 'agama': 'Pendidikan Agama', + 'pkn': 'Pendidikan Kewarganegaraan', + 'indo': 'Bahasa Indonesia', + 'penjas': 'Pendidikan Jasmani dan Kesehatan', + 'senbud': 'Seni Budaya', + 'mtk': 'Matematika', + 'inggris': 'Bahasa Inggris', + 'ipa': 'Ilmu Pengetahuan Alam', + 'ips': 'Ilmu Pengetahuan Sosial', + 'fisika': 'Fisika', + 'kimia': 'Kimia', + 'kwh': 'Kewirausahaan', + 'kkpi': 'Keterampilan Komputer dan Pengelolaan Informasi', + 'dkk': 'Dasar Kompetensi Keahlian', + 'kk': 'Kompetensi Keahlian', + 'mandarin': 'Bahasa Mandarin', + 'kbi': 'Korespondensi Bahasa Inggris', + 'pap': 'Praktek Administrasi Perkantoran', + 'myob': 'MYOB' + }, + rataRata: { + raport: [], + usbn: [], + unbk: [] + }, + view: function view() { + component.rataRata = { + raport: [], + usbn: [], + unbk: [] + }; + return [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('form.form', { + onsubmit: function onsubmit(e) { + e.preventDefault(); + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].cariData({ + nisn: e.target.elements.nisn.value, + tanggalLahir: e.target.elements.tanggalLahir.value, + src: 'sk-hasil-belajar', + "with": 'hasilBelajar' + }); + } + }, Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-grid', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-nisn]', 'NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Nomor Induk Siswa Nasional. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) ? _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.siswa[0] + ' ') : _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.nisn[0] + ' ') : '' : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.form-group', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.input-helper', ['Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529. ', !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error) && _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir != undefined ? Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.error', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].error.errors.tanggalLahir[0] + ' ') : ''])]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.form-submit#input-submit[type=submit]', 'Lihat')])), lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), !lodash_isempty__WEBPACK_IMPORTED_MODULE_1___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.access_log) ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('button.print-button', { + onclick: function onclick() { + window.print(); + } + }, [mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust('⎙'), ' Print']), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('img[src=img/letter-head.jpg]')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('', { + style: { + height: '1px', + width: '100%', + backgroundColor: '#000', + marginTop: '.5rem' + } + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('', { + style: { + height: '3px', + width: '100%' + } + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('', { + style: { + height: '3px', + width: '100%', + backgroundColor: '#000', + marginBottom: '1rem' + } + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__body', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('strong.letter__body-header', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('span.border-b.border-black', 'SURAT KETERANGAN')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('p.font-normal.mt-1', 'Nomor: 077/SMK-BA/V/2019')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('br'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Yang bertanda tangan di bawah ini :')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Drs. Engkos Kosasih, M.M.')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Jabatan'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'Kepala Sekolah')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Asal Sekolah'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', 'SMK Bhakti Anindya')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Menerangkan bahwa')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nama'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.nama)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tempat / Tanggal Lahir'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.tempat_lahir + ' , ' + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.tanggal_lahir)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'NIS / NISN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.nis + ' / ' + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.nisn)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Nomor Peserta'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.nopes)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kelas'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.kelas)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Bidang Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.bsk)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Program Studi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.psk)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kompetensi Keahlian'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', ':'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=3]', _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.kk)]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Adalah benar siswa SMK Bhakti Anindya, Kota Tangerang dan pada tanggal 13 Mei 2019 telah dinyatakan lulus')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Berikut hasil belajar siswa tersebut :')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table.nilai', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', { + style: { + width: '5%' + } + }, 'No.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=2]', 'Mata Pelajaran'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Rata-rata Raport Semester 1-6'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'Raport'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Ujian Sekolah Berstandar Nasional'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'USBN'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.long.md:w-1/5', 'Ujian Nasional Berbasis Komputer'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th.short.md:w-1/5', 'UNBK')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'A.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Normatif')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.normatif, function (nilai, mapel) { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); + })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'B.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Adaptif')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.adaptif, function (nilai, mapel) { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); + }), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'C.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Produktif')])), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.produktif, function (nilai, mapel) { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); + })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th', 'D.'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=5].text-left', 'Mulok')]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tbody.counter', lodash_map__WEBPACK_IMPORTED_MODULE_2___default()(_models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current.hasil_belajar.meta.mulok, function (nilai, mapel) { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-right'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=2]', component.namaMapel[mapel]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null)]); + })), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('th[colspan=3]', 'Rata-rata'), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', (component.rataRata.raport.reduce(function (total, num) { + return total + num; + }) / component.rataRata.raport.length).toFixed(2)), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', (component.rataRata.usbn.reduce(function (total, num) { + return total + num; + }) / component.rataRata.usbn.length).toFixed(2)), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td.text-center', (component.rataRata.unbk.reduce(function (total, num) { + return total + num; + }) / component.rataRata.unbk.length).toFixed(2))])]))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', mithril__WEBPACK_IMPORTED_MODULE_0__["default"].trust(' '))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td[colspan=6]', 'Demikian Surat Keterangan ini dibuat untuk siswa yang bersangkutan melanjutkan ke jenjang yang lebih tinggi.'))]), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('table.signature', [Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Tangerang, 13 Mei 2019')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Kepala Sekolah,')), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('.letter__sign', { + style: { + height: '3rem' + } + }))), Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('tr', Object(mithril__WEBPACK_IMPORTED_MODULE_0__["default"])('td', 'Drs. Engkos Kosasih, M.M.'))])])])]; } -}); +}; +/* harmony default export */ __webpack_exports__["default"] = (component); /***/ }), @@ -4829,7 +4966,8 @@ __webpack_require__.r(__webpack_exports__); var component = { oninit: function oninit() { document.title = 'Surat Keterangan Hasil Belajar Siswa - SMK Bhakti Anindya'; - _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current = {}, _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); + _models_Siswa__WEBPACK_IMPORTED_MODULE_3__["default"].current = {}; + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); }, namaMapel: { 'agama': 'Pendidikan Agama', diff --git a/resources/js/app.js b/resources/js/app.js index 41dd183..a005943 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,65 +1,70 @@ import m from "mithril" import SuratKelulusan from "./components/SuratKelulusan" import SKHasilBelajar from "./components/SKHasilBelajar" +import Pendopo from "./components/Pendopo" import Siswa from "./models/Siswa" import AccessLog from "./models/AccessLog" -m.route.prefix('#'); -m.route(document.body.querySelector('.container'), '/', { - '/': SuratKelulusan, - '/hasil-belajar': SKHasilBelajar, -}); +if (document.body.querySelector('.container#pendopo') === null) { + m.route.prefix('#'); + m.route(document.body.querySelector('.container'), '/', { + '/': SuratKelulusan, + '/hasil-belajar': SKHasilBelajar, + }); -// Below is to handle Ctrl+P or MouseR->Print -window.addEventListener("beforeprint", function () { - if (m.route.get() === '/hasil-belajar') { - // If the print button did not exists, show nothing when printing - if (document.body.querySelector('button.print-button') === null) - document.body.style.display = 'none'; - else { - if (!component.confirmPrint) { - alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); - component.confirmPrint = 1; - AccessLog.create({siswaId: Siswa.current.id, src: 'sk-hasil-belajar'}).then(() => { - AccessLog.fetch('sk-hasil-belajar'); - }) - .catch(e => { - if (e.code === 0) { - AccessLog.error = { - message: e.message, - errors: { - create: ['Terjadi kesalahan saat menghubungkan ke server.'], - }, - }; - } - else { - AccessLog.error = JSON.parse(e.message); - } - }); + // Below is to handle Ctrl+P or MouseR->Print + window.addEventListener("beforeprint", function () { + if (m.route.get() === '/hasil-belajar') { + // If the print button did not exists, show nothing when printing + if (document.body.querySelector('button.print-button') === null) + document.body.style.display = 'none'; + else { + if (!component.confirmPrint) { + alert('Surat Keterangan ini hanya dapat dicetak satu kali. Lanjutkan?'); + component.confirmPrint = 1; + AccessLog.create({siswaId: Siswa.current.id, src: 'sk-hasil-belajar'}).then(() => { + AccessLog.fetch('sk-hasil-belajar'); + }) + .catch(e => { + if (e.code === 0) { + AccessLog.error = { + message: e.message, + errors: { + create: ['Terjadi kesalahan saat menghubungkan ke server.'], + }, + }; + } + else { + AccessLog.error = JSON.parse(e.message); + } + }); + } } } - } -}); + }); -window.addEventListener("afterprint", function () { - if (m.route.get() === '/hasil-belajar') { - // Give back the whole document.body - if (document.body.querySelector('button.print-button') === null) - document.body.style.display = 'block'; + window.addEventListener("afterprint", function () { + if (m.route.get() === '/hasil-belajar') { + // Give back the whole document.body + if (document.body.querySelector('button.print-button') === null) + document.body.style.display = 'block'; - // Hide the print button - if (document.body.querySelector('button.print-button') !== null) - document.body.querySelector('button.print-button').style.display = 'none'; - - // To redraw the content to prevent printing - let nisn = document.body.querySelector('input[name=nisn]').value, - tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; - Siswa.cariData({ - nisn, - tanggalLahir, - src: 'sk-hasil-belajar', - with: ['hasilBelajar', 'accessLog'], - }); - } -}); + // Hide the print button + if (document.body.querySelector('button.print-button') !== null) + document.body.querySelector('button.print-button').style.display = 'none'; + // To redraw the content to prevent printing + let nisn = document.body.querySelector('input[name=nisn]').value, + tanggalLahir = document.body.querySelector('input[name=tanggalLahir]').value; + Siswa.cariData({ + nisn, + tanggalLahir, + src: 'sk-hasil-belajar', + with: ['hasilBelajar', 'accessLog'], + }); + } + }); +} +else { + m.mount(document.body.querySelector('.container#pendopo'), Pendopo); +} diff --git a/resources/js/components/Pendopo.js b/resources/js/components/Pendopo.js new file mode 100644 index 0000000..ba8d38e --- /dev/null +++ b/resources/js/components/Pendopo.js @@ -0,0 +1,318 @@ +import m from "mithril" +import _isEmpty from "lodash.isempty" +import _map from "lodash.map" +import Siswa from "../models/Siswa" + +var component = { + oninit: () => { + document.title = 'Surat Keterangan Hasil Belajar Siswa - SMK Bhakti Anindya'; + Siswa.current = {}; + }, + namaMapel: { + 'agama': 'Pendidikan Agama', + 'pkn': 'Pendidikan Kewarganegaraan', + 'indo': 'Bahasa Indonesia', + 'penjas': 'Pendidikan Jasmani dan Kesehatan', + 'senbud': 'Seni Budaya', + 'mtk': 'Matematika', + 'inggris': 'Bahasa Inggris', + 'ipa': 'Ilmu Pengetahuan Alam', + 'ips': 'Ilmu Pengetahuan Sosial', + 'fisika': 'Fisika', + 'kimia': 'Kimia', + 'kwh': 'Kewirausahaan', + 'kkpi': 'Keterampilan Komputer dan Pengelolaan Informasi', + 'dkk': 'Dasar Kompetensi Keahlian', + 'kk': 'Kompetensi Keahlian', + 'mandarin': 'Bahasa Mandarin', + 'kbi': 'Korespondensi Bahasa Inggris', + 'pap': 'Praktek Administrasi Perkantoran', + 'myob': 'MYOB', + }, + rataRata: { + raport: [], + usbn: [], + unbk: [], + }, + view: () => { + component.rataRata = { + raport: [], + usbn: [], + unbk: [], + }; + return [ + m('.header', [ + m('h1.title', 'Surat Keterangan Hasil Belajar Siswa SMK Bhakti Anindya'), + m('span', 'Silahkan masukkan Nama Lengkap dan NISN kamu di bawah ini.'), + ]), + m('form.form', { + onsubmit: e => { + e.preventDefault(); + Siswa.cariData({ + nisn: e.target.elements.nisn.value, + tanggalLahir: e.target.elements.tanggalLahir.value, + src: 'sk-hasil-belajar', + with: 'hasilBelajar', + }); + } + }, + m('.form-grid', [ + m('.form-group', [ + m('label.form-label[for=input-nisn]', 'NISN'), + m('input.form-input.input-text#input-nisn[name=nisn][type=text][autocomplete=off][required]'), + m('p.input-helper', [ + 'Nomor Induk Siswa Nasional. ', + !_isEmpty(Siswa.error) ? + Siswa.error.errors.siswa != undefined ? m('span.error', Siswa.error.errors.siswa[0] + ' ') + : Siswa.error.errors.nisn != undefined ? m('span.error', Siswa.error.errors.nisn[0] + ' ') + : '' : '', + ]), + ]), + m('.form-group', [ + m('label.form-label[for=input-tanggalLahir]', 'Tanggal Lahir'), + m('input.form-input.input-text#input-tanggalLahir[name=tanggalLahir][type=text][autocomplete=off][required]'), + m('p.input-helper', [ + 'Tanggal lahir dengan format YYYYMMDD. Contoh: untuk tanggal 29 Mei 2000 ditulis 20000529. ', + !_isEmpty(Siswa.error) && Siswa.error.errors.tanggalLahir != undefined ? m('span.error', Siswa.error.errors.tanggalLahir[0] + ' ') : '', + ]), + ]), + m('button.form-submit#input-submit[type=submit]', 'Lihat'), + ])), + _isEmpty(Siswa.current) ? null : m('.letter', [ + m('span.mobile-info', 'Untuk mencetak surat ini, harap gunakan browser di desktop PC.'), + !_isEmpty(Siswa.current.access_log) ? null + : m('button.print-button', { + onclick: () => { + window.print(); + } + }, [ + m.trust('⎙'), + ' Print', + ]), + m('.letter__header', [ + m('img[src=img/letter-head.jpg]'), + ]), + m('', { + style: { + height: '1px', + width: '100%', + backgroundColor: '#000', + marginTop: '.5rem', + }}), + m('', { + style: { + height: '3px', + width: '100%', + }}), + m('', { + style: { + height: '3px', + width: '100%', + backgroundColor: '#000', + marginBottom: '1rem', + }}), + m('.letter__body', [ + m('strong.letter__body-header', [ + m('p', m('span.border-b.border-black', 'SURAT KETERANGAN')), + m('p.font-normal.mt-1', 'Nomor: 077/SMK-BA/V/2019'), + ]), + m('br'), + m('table', [ + m('tr', + m('td[colspan=6]', 'Yang bertanda tangan di bawah ini :')), + m('tr', [ + m('td'), + m('td', 'Nama'), + m('td', ':'), + m('td[colspan=3]', 'Drs. Engkos Kosasih, M.M.'), + ]), + m('tr', [ + m('td'), + m('td', 'Jabatan'), + m('td', ':'), + m('td[colspan=3]', 'Kepala Sekolah'), + ]), + m('tr', [ + m('td'), + m('td', 'Asal Sekolah'), + m('td', ':'), + m('td[colspan=3]', 'SMK Bhakti Anindya'), + ]), + m('tr', + m('td', + m.trust(' '))), + m('tr', + m('td[colspan=6]', 'Menerangkan bahwa')), + m('tr', + m('td', + m.trust(' '))), + m('tr', [ + m('td'), + m('td', 'Nama'), + m('td', ':'), + m('td[colspan=3]', Siswa.current.nama), + ]), + m('tr', [ + m('td'), + m('td', 'Tempat / Tanggal Lahir'), + m('td', ':'), + m('td', Siswa.current.tempat_lahir + ' , ' + Siswa.current.tanggal_lahir), + ]), + m('tr', [ + m('td'), + m('td', 'NIS / NISN'), + m('td', ':'), + m('td', Siswa.current.nis + ' / ' + Siswa.current.nisn), + ]), + m('tr', [ + m('td'), + m('td', 'Nomor Peserta'), + m('td', ':'), + m('td[colspan=3]', Siswa.current.nopes), + ]), + m('tr', [ + m('td'), + m('td', 'Kelas'), + m('td', ':'), + m('td[colspan=3]', Siswa.current.kelas), + ]), + m('tr', [ + m('td'), + m('td', 'Bidang Studi Keahlian'), + m('td', ':'), + m('td[colspan=3]', Siswa.current.bsk), + ]), + m('tr', [ + m('td'), + m('td', 'Program Studi Keahlian'), + m('td', ':'), + m('td[colspan=3]', Siswa.current.psk), + ]), + m('tr', [ + m('td'), + m('td', 'Kompetensi Keahlian'), + m('td', ':'), + m('td[colspan=3]', Siswa.current.kk), + ]), + m('tr', + m('td', + m.trust(' '))), + m('tr', + m('td[colspan=6]', 'Adalah benar siswa SMK Bhakti Anindya, Kota Tangerang dan pada tanggal 13 Mei 2019 telah dinyatakan lulus')), + m('tr', + m('td[colspan=6]', 'Berikut hasil belajar siswa tersebut :')), + m('tr', + m('td', + m.trust(' '))), + m('tr', + m('td[colspan=6]', + m('table.nilai', [ + m('tr', [ + m('th', { style: { width: '5%' } }, 'No.'), + m('th[colspan=2]', 'Mata Pelajaran'), + m('th.long.md:w-1/5', 'Rata-rata Raport Semester 1-6'), + m('th.short.md:w-1/5', 'Raport'), + m('th.long.md:w-1/5', 'Ujian Sekolah Berstandar Nasional'), + m('th.short.md:w-1/5', 'USBN'), + m('th.long.md:w-1/5', 'Ujian Nasional Berbasis Komputer'), + m('th.short.md:w-1/5', 'UNBK'), + ]), + m('tr', [ + m('th', 'A.'), + m('th[colspan=5].text-left', 'Normatif'), + ]), + m('tbody.counter', + _map(Siswa.current.hasil_belajar.meta.normatif, (nilai, mapel) => { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : m('tr', [ + m('td.text-right'), + m('td[colspan=2]', component.namaMapel[mapel]), + m('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), + m('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), + m('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null), + ]); + })), + m('tr', [ + m('th', 'B.'), + m('th[colspan=5].text-left', 'Adaptif'), + ]), + m('tbody.counter', + _map(Siswa.current.hasil_belajar.meta.adaptif, (nilai, mapel) => { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : m('tr', [ + m('td.text-right'), + m('td[colspan=2]', component.namaMapel[mapel]), + m('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), + m('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), + m('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null), + ]); + }), + m('tr', [ + m('th', 'C.'), + m('th[colspan=5].text-left', 'Produktif'), + ])), + m('tbody.counter', + _map(Siswa.current.hasil_belajar.meta.produktif, (nilai, mapel) => { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : m('tr', [ + m('td.text-right'), + m('td[colspan=2]', component.namaMapel[mapel]), + m('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), + m('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), + m('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null), + ]); + })), + m('tr', [ + m('th', 'D.'), + m('th[colspan=5].text-left', 'Mulok'), + ]), + m('tbody.counter', + _map(Siswa.current.hasil_belajar.meta.mulok, (nilai, mapel) => { + if (nilai.raport != 0) component.rataRata.raport.push(nilai.raport); + if (nilai.usbn != 0) component.rataRata.usbn.push(nilai.usbn); + if (nilai.unbk != 0) component.rataRata.unbk.push(nilai.unbk); + return nilai.raport == 0 && nilai.usbn == 0 && nilai.unbk == 0 ? null : m('tr', [ + m('td.text-right'), + m('td[colspan=2]', component.namaMapel[mapel]), + m('td.text-center', nilai.raport !== 0 ? nilai.raport.toFixed(2) : null), + m('td.text-center', nilai.usbn !== 0 ? nilai.usbn.toFixed(2) : null), + m('td.text-center', nilai.unbk !== 0 ? nilai.unbk.toFixed(2) : null), + ]); + })), + m('tr', [ + m('th[colspan=3]', 'Rata-rata'), + m('td.text-center', (component.rataRata.raport.reduce((total, num) => total + num) / component.rataRata.raport.length).toFixed(2)), + m('td.text-center', (component.rataRata.usbn.reduce((total, num) => total + num) / component.rataRata.usbn.length).toFixed(2)), + m('td.text-center', (component.rataRata.unbk.reduce((total, num) => total + num) / component.rataRata.unbk.length).toFixed(2)), + ]), + ]))), + m('tr', + m('td', + m.trust(' '))), + m('tr', + m('td[colspan=6]', 'Demikian Surat Keterangan ini dibuat untuk siswa yang bersangkutan melanjutkan ke jenjang yang lebih tinggi.')), + ]), + m('table.signature', [ + m('tr', + m('td', 'Tangerang, 13 Mei 2019')), + m('tr', + m('td', 'Kepala Sekolah,')), + m('tr', + m('td', + m('.letter__sign', { style: { height: '3rem' } }))), + m('tr', + m('td', 'Drs. Engkos Kosasih, M.M.')), + ]), + ]), + ]), + ]; + }, +}; + +export default component; diff --git a/resources/js/components/SKHasilBelajar.js b/resources/js/components/SKHasilBelajar.js index 445cfd0..eded992 100644 --- a/resources/js/components/SKHasilBelajar.js +++ b/resources/js/components/SKHasilBelajar.js @@ -7,7 +7,7 @@ import AccessLog from "../models/AccessLog" var component = { oninit: () => { document.title = 'Surat Keterangan Hasil Belajar Siswa - SMK Bhakti Anindya'; - Siswa.current = {}, + Siswa.current = {}; AccessLog.fetch('sk-hasil-belajar'); }, namaMapel: { diff --git a/resources/views/main.blade.php b/resources/views/main.blade.php index 3845a3f..58ada00 100644 --- a/resources/views/main.blade.php +++ b/resources/views/main.blade.php @@ -10,12 +10,12 @@ - +
- + diff --git a/resources/views/pendopo.blade.php b/resources/views/pendopo.blade.php new file mode 100644 index 0000000..127f1df --- /dev/null +++ b/resources/views/pendopo.blade.php @@ -0,0 +1,21 @@ + + + + + + + Pendopo + + + + + + + + +
+
+ + + + diff --git a/routes/web.php b/routes/web.php index 5272f77..c1fba75 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,3 +14,7 @@ Route::get('/', function () { return view('main'); }); + +Route::get('/pendopo', function () { + return view('pendopo'); +})->middleware('pendopo'); From 72c28cf44a3257b74212f788e1779bdb807730bd Mon Sep 17 00:00:00 2001 From: Gregorio Chiko Putra Date: Fri, 17 May 2019 12:05:52 +0700 Subject: [PATCH 11/11] Bumped version to v1.1.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0a09895..a82af39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "smk-kelulusan", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1020dca..778312d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "smk-kelulusan", - "version": "1.0.0", + "version": "1.1.0", "description": "", "main": "webpack.mix.js", "directories": {