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/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/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/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..d875fe7 --- /dev/null +++ b/app/HasilBelajar.php @@ -0,0 +1,29 @@ + 'array', + ]; + + 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..1fac937 --- /dev/null +++ b/app/Http/Controllers/SiswaController.php @@ -0,0 +1,72 @@ +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); + if ($request->with !== null) + $siswa = $siswa->with($request->with); + + $siswa = $siswa->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 + * + */ + if ($request->src == 'surat-kelulusan') + AccessLog::create(['siswa_id' => $siswa->id, 'src' => $request->src]); + + return $siswa; + } +} 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/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/app/Siswa.php b/app/Siswa.php index acf6fc3..6af2873 100644 --- a/app/Siswa.php +++ b/app/Siswa.php @@ -21,4 +21,14 @@ class Siswa extends Model 'tanggal_lahir' => 'datetime:Y-m-d', 'lulus' => 'boolean', ]; + + public function accessLog() + { + return $this->hasMany('App\AccessLog'); + } + + public function hasilBelajar() + { + return $this->hasOne('App\HasilBelajar'); + } } 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'); + } +} diff --git a/database/migrations/2019_05_15_020128_add_src_field_to_access_logs_table.php b/database/migrations/2019_05_15_020128_add_src_field_to_access_logs_table.php new file mode 100644 index 0000000..46f4a93 --- /dev/null +++ b/database/migrations/2019_05_15_020128_add_src_field_to_access_logs_table.php @@ -0,0 +1,34 @@ +string('src'); + }); + + DB::table('access_logs')->update(['src' => 'surat-kelulusan']); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('access_logs', function (Blueprint $table) { + $table->dropColumn('src'); + }); + } +} diff --git a/package-lock.json b/package-lock.json index 6c5f3e0..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": { @@ -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..778312d 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,14 @@ { "name": "smk-kelulusan", - "version": "1.0.0", + "version": "1.1.0", "description": "", "main": "webpack.mix.js", "directories": { "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 3c5d85d..48a4d0b 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -7641,6 +7641,30 @@ 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.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; @@ -7752,6 +7776,14 @@ span.error { .letter .print-button { display: initial; } + + .letter table.nilai .long { + display: table-cell; + } + + .letter table.nilai .short { + display: none; + } } @media print { @@ -7782,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 3ba6453..d6034fe 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 ***! @@ -2361,31 +4739,401 @@ 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"); +/* 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"); + + + + + + + +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 + + 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_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 _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 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"); -mithril__WEBPACK_IMPORTED_MODULE_0__["default"].mount(document.body.querySelector('.container'), { +var component = { oninit: function oninit() { - _models_AccessLog__WEBPACK_IMPORTED_MODULE_3__["default"].fetch(); + 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() { - 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', { + 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); + +/***/ }), + +/***/ "./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"); +/* 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"); + + + + + +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: { + '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: [] + }, + // 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: [], + 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 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({ + nisn: e.target.elements.nisn.value, + tanggalLahir: e.target.elements.tanggalLahir.value, + src: 'sk-hasil-belajar', + "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.'), !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' + }).then(function () { + _models_AccessLog__WEBPACK_IMPORTED_MODULE_4__["default"].fetch('sk-hasil-belajar'); + window.print(); + })["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); + } + }); + } + } + }, [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%', + 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); + +/***/ }), + +/***/ "./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"); + + + + +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', '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({ 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', { + }, 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(); } @@ -2410,7 +5158,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); /***/ }), @@ -2427,10 +5176,35 @@ __webpack_require__.r(__webpack_exports__); var model = { current: {}, - fetch: function fetch() { - mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ + error: {}, + fetch: function fetch(src) { + model.current = {}; + model.error = {}; + 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; + })["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) { + model.error = {}; + return mithril__WEBPACK_IMPORTED_MODULE_0__["default"].request({ + method: 'post', + url: '/api/access_log', + data: data }).then(function (response) { model.current = response; }); @@ -2458,15 +5232,22 @@ 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 }).then(function (response) { model.current = response; - _AccessLog__WEBPACK_IMPORTED_MODULE_1__["default"].fetch(); + _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/app.js b/resources/js/app.js index 6929ee7..a005943 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,274 +1,70 @@ import m from "mithril" -import _isEmpty from "lodash.isempty" +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.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, - }); +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); + } + }); } - }, - 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.')), - ]), - ]), - ]), - ]; - }, -}); + } + } + }); + + 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'], + }); + } + }); +} +else { + m.mount(document.body.querySelector('.container#pendopo'), Pendopo); +} 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 @@ - - - - - - Example Component - - - I'm an example component. - - - - - - - - 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 new file mode 100644 index 0000000..eded992 --- /dev/null +++ b/resources/js/components/SKHasilBelajar.js @@ -0,0 +1,355 @@ +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: () => { + document.title = 'Surat Keterangan Hasil Belajar Siswa - SMK Bhakti Anindya'; + Siswa.current = {}; + 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: [], + }, + // 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: [], + usbn: [], + unbk: [], + }; + return [ + m('.header', [ + m('span.italic.text-xs', [ + 'Saat ini sudah ', + m('strong', [ + AccessLog.current.accessed, + ' / ', + AccessLog.current.total, + ]), + ' 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.'), + ]), + 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', 'accessLog'], + }); + } + }, + 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: () => { + 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(); + }) + .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); + } + }); + } + } + }, [ + 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]'), + ]), + 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/SuratKelulusan.js b/resources/js/components/SuratKelulusan.js new file mode 100644 index 0000000..aa6835e --- /dev/null +++ b/resources/js/components/SuratKelulusan.js @@ -0,0 +1,279 @@ +import m from "mithril"; +import _isEmpty from "lodash.isempty" +import Siswa from "../models/Siswa" +import AccessLog from "../models/AccessLog" + +var component = { + oninit: () => { + document.title = 'Surat Kelulusan Siswa - SMK Bhakti Anindya'; + Siswa.current = {}; + AccessLog.fetch('surat-kelulusan'); + }, + 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 Kelulusan 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: 'surat-kelulusan', + }); + } + }, + 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'), + ])), + 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/js/models/AccessLog.js b/resources/js/models/AccessLog.js index 5624520..be64dde 100644 --- a/resources/js/models/AccessLog.js +++ b/resources/js/models/AccessLog.js @@ -2,15 +2,42 @@ import m from "mithril" var model = { current: {}, - fetch: () => { - m.request({ + error: {}, + fetch: src => { + model.current = {}; + model.error = {}; + return m.request({ method: 'get', url: '/api/access_log', + data: { src }, }) - .then(response => { - model.current = response; - }); + .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 => { + model.error = {}; + return m.request({ + method: 'post', + url: '/api/access_log', + data, + }) + .then(response => { + model.current = response; + }); + }, +}; export default model; diff --git a/resources/js/models/Siswa.js b/resources/js/models/Siswa.js index baaded1..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', @@ -13,10 +14,19 @@ var model = { }) .then(response => { model.current = response; - AccessLog.fetch(); + 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/resources/sass/main.scss b/resources/sass/main.scss index af13715..a3300b8 100644 --- a/resources/sass/main.scss +++ b/resources/sass/main.scss @@ -84,6 +84,29 @@ span.error { } } + table.nilai { + th, td { + @apply border border-black px-1; + } + + .long { + @apply hidden; + } + + .short { + display: table-cell; + } + + tbody.counter { + counter-reset: nomor; + + td:first-child::before { + counter-increment: nomor; + content: counter(nomor) "."; + } + } + } + table.signature { @apply w-auto ml-auto mt-4; @@ -156,6 +179,16 @@ span.error { .print-button { display: initial; } + + table.nilai { + .long { + display: table-cell; + } + + .short { + @apply hidden; + } + } } } @@ -183,5 +216,15 @@ span.error { .letter__body-header { font-size: 14px; } + + table.nilai { + .long { + display: table-cell; + } + + .short { + @apply hidden; + } + } } } 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 @@ - + - +