/******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/assets/js/components/passport/AuthorizedClients.vue?vue&type=script&lang=js&": /*!****************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/assets/js/components/passport/AuthorizedClients.vue?vue&type=script&lang=js& ***! \****************************************************************************************************************************************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ props: ['clientsUrl', 'tokensUrl'], /* * The component's data. */ data: function data() { return { tokens: [] }; }, /** * Prepare the component (Vue 1.x). */ ready: function ready() { this.prepareComponent(); }, /** * Prepare the component (Vue 2.x). */ mounted: function mounted() { this.prepareComponent(); }, methods: { /** * Prepare the component (Vue 2.x). */ prepareComponent: function prepareComponent() { this.getTokens(); }, /** * Get all of the authorized tokens for the user. */ getTokens: function getTokens() { var _this = this; this.$http.get(this.tokensUrl).then(function (response) { _this.tokens = response.data; }); }, /** * Revoke the given token. */ revoke: function revoke(token) { var _this2 = this; this.$http["delete"](this.tokensUrl + '/' + token.id).then(function (response) { _this2.getTokens(); }); } } }); /***/ }), /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/assets/js/components/passport/Clients.vue?vue&type=script&lang=js&": /*!******************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/assets/js/components/passport/Clients.vue?vue&type=script&lang=js& ***! \******************************************************************************************************************************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ /* * The component's data. */ props: ['clientsUrl'], data: function data() { return { clients: [], createForm: { errors: [], name: '', redirect: '' }, editForm: { errors: [], name: '', redirect: '' } }; }, /** * Prepare the component (Vue 1.x). */ ready: function ready() { this.prepareComponent(); }, /** * Prepare the component (Vue 2.x). */ mounted: function mounted() { this.prepareComponent(); }, methods: { /** * Prepare the component. */ prepareComponent: function prepareComponent() { this.getClients(); $('#modal-create-client').on('shown.bs.modal', function () { $('#create-client-name').focus(); }); $('#modal-edit-client').on('shown.bs.modal', function () { $('#edit-client-name').focus(); }); }, /** * Get all of the OAuth clients for the user. */ getClients: function getClients() { var _this = this; this.$http.get(this.clientsUrl).then(function (response) { _this.clients = response.data; }); }, /** * Show the form for creating new clients. */ showCreateClientForm: function showCreateClientForm() { $('#modal-create-client').modal('show'); }, /** * Create a new OAuth client for the user. */ store: function store() { this.persistClient('post', this.clientsUrl, this.createForm, '#modal-create-client'); }, /** * Edit the given client. */ edit: function edit(client) { this.editForm.id = client.id; this.editForm.name = client.name; this.editForm.redirect = client.redirect; $('#modal-edit-client').modal('show'); }, /** * Update the client being edited. */ update: function update() { this.persistClient('put', this.clientsUrl + '/' + this.editForm.id, this.editForm, '#modal-edit-client'); }, /** * Persist the client to storage using the given form. */ persistClient: function persistClient(method, uri, form, modal) { var _this2 = this; console.log('persisting'); form.errors = []; console.log('method: ' + method); this.$http[method](uri, form).then(function (response) { _this2.getClients(); form.name = ''; form.redirect = ''; form.errors = []; $(modal).modal('hide'); })["catch"](function (response) { if (_typeof(response.data) === 'object') { form.errors = _.flatten(_.toArray(response.data)); } else { form.errors = ['Something went wrong. Please try again.']; } }); }, /** * Destroy the given client. */ destroy: function destroy(client) { var _this3 = this; this.$http["delete"](this.clientsUrl + '/' + client.id).then(function (response) { _this3.getClients(); }); } } }); /***/ }), /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/assets/js/components/passport/PersonalAccessTokens.vue?vue&type=script&lang=js&": /*!*******************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/assets/js/components/passport/PersonalAccessTokens.vue?vue&type=script&lang=js& ***! \*******************************************************************************************************************************************************************************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ props: ['tokenUrl', 'scopesUrl'], /* * The component's data. */ data: function data() { return { accessToken: null, tokens: [], scopes: [], form: { name: '', scopes: [], errors: [] } }; }, /** * Prepare the component (Vue 1.x). */ ready: function ready() { this.prepareComponent(); }, /** * Prepare the component (Vue 2.x). */ mounted: function mounted() { this.prepareComponent(); }, methods: { /** * Prepare the component. */ prepareComponent: function prepareComponent() { this.getTokens(); this.getScopes(); $('#modal-create-token').on('shown.bs.modal', function () { $('#create-token-name').focus(); }); }, /** * Get all of the personal access tokens for the user. */ getTokens: function getTokens() { var _this = this; this.$http.get(this.tokenUrl).then(function (response) { _this.tokens = response.data; }); }, /** * Get all of the available scopes. */ getScopes: function getScopes() { var _this2 = this; this.$http.get(this.scopesUrl).then(function (response) { _this2.scopes = response.data; }); }, /** * Show the form for creating new tokens. */ showCreateTokenForm: function showCreateTokenForm() { $('#modal-create-token').modal('show'); }, /** * Create a new personal access token. */ store: function store() { var _this3 = this; this.accessToken = null; this.form.errors = []; this.$http.post(this.tokenUrl, this.form).then(function (response) { _this3.form.name = ''; _this3.form.scopes = []; _this3.form.errors = []; _this3.tokens.push(response.data.token); _this3.showAccessToken(response.data.accessToken); })["catch"](function (response) { if (_typeof(response.data) === 'object') { _this3.form.errors = _.flatten(_.toArray(response.data)); } else { console.dir(_this3.form); _this3.form.errors = ['Something went wrong. Please try again.']; } }); }, /** * Toggle the given scope in the list of assigned scopes. */ toggleScope: function toggleScope(scope) { if (this.scopeIsAssigned(scope)) { this.form.scopes = _.reject(this.form.scopes, function (s) { return s == scope; }); } else { this.form.scopes.push(scope); } }, /** * Determine if the given scope has been assigned to the token. */ scopeIsAssigned: function scopeIsAssigned(scope) { return _.indexOf(this.form.scopes, scope) >= 0; }, /** * Show the given access token to the user. */ showAccessToken: function showAccessToken(accessToken) { $('#modal-create-token').modal('hide'); this.accessToken = accessToken; $('#modal-access-token').modal('show'); }, /** * Revoke the given token. */ revoke: function revoke(token) { var _this4 = this; this.$http["delete"](this.tokenUrl + '/' + token.id).then(function (response) { _this4.getTokens(); }); } } }); /***/ }), /***/ "./resources/assets/js/bootstrap.js": /*!******************************************!*\ !*** ./resources/assets/js/bootstrap.js ***! \******************************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { window._ = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js"); /** * We'll load jQuery and the Bootstrap jQuery plugin which provides support * for JavaScript based Bootstrap features such as modals and tabs. This * code may be modified to fit the specific needs of your application. */ //window.$ = window.jQuery = require('jquery'); /** * jQuery UI is loaded here and then the tooltip is assigned another funtion name * This resolves the issue of jquery-ui & bootstrap tooltip conflict */ __webpack_require__(/*! jquery-ui */ "./node_modules/jquery-ui/ui/widget.js"); jQuery.fn.uitooltip = jQuery.fn.tooltip; /** * Load boostrap */ __webpack_require__(/*! bootstrap-less */ "./node_modules/bootstrap-less/js/bootstrap.js"); /** * Vue is a modern JavaScript library for building interactive web interfaces * using reactive data binding and reusable components. Vue's API is clean * and simple, leaving you to focus on building your next great project. */ window.Vue = (__webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm.js")["default"]); window.eventHub = new Vue(); __webpack_require__(/*! vue-resource */ "./node_modules/vue-resource/dist/vue-resource.esm.js"); /** * We'll register a HTTP interceptor to attach the "CSRF" header to each of * the outgoing requests issued by this application. The CSRF middleware * included with Laravel will automatically verify the header's value. */ Vue.http.interceptors.push(function (request, next) { request.headers.set('X-CSRF-TOKEN', Laravel.csrfToken); next(); }); // require('admin-lte'); // require('chart.js'); // require('jquery-form-validator'); //says something about dependency /** * Echo exposes an expressive API for subscribing to channels and listening * for events that are broadcast by Laravel. Echo and event broadcasting * allows your team to easily build robust real-time web applications. */ // import Echo from "laravel-echo" // window.Echo = new Echo({ // broadcaster: 'pusher', // key: 'your-pusher-key' // }); /***/ }), /***/ "./resources/assets/js/snipeit.js": /*!****************************************!*\ !*** ./resources/assets/js/snipeit.js ***! \****************************************/ /***/ (() => { // var jQuery = require('jquery'); // window.jQuery = jQuery // window.$ = jQuery /** * Module containing core application logic. * @param {jQuery} $ Insulated jQuery object * @param {JSON} settings Insulated `window.snipeit.settings` object. * @return {IIFE} Immediately invoked. Returns self. */ lineOptions = { legend: { position: "bottom" }, scales: { yAxes: [{ ticks: { fontColor: "rgba(0,0,0,0.5)", fontStyle: "bold", beginAtZero: true, maxTicksLimit: 5, padding: 20 }, gridLines: { drawTicks: false, display: false } }], xAxes: [{ gridLines: { zeroLineColor: "transparent" }, ticks: { padding: 20, fontColor: "rgba(0,0,0,0.5)", fontStyle: "bold" } }] } }; pieOptions = { //Boolean - Whether we should show a stroke on each segment segmentShowStroke: true, //String - The colour of each segment stroke segmentStrokeColor: "#fff", //Number - The width of each segment stroke segmentStrokeWidth: 1, //Number - The percentage of the chart that we cut out of the middle percentageInnerCutout: 50, // This is 0 for Pie charts //Number - Amount of animation steps animationSteps: 100, //String - Animation easing effect animationEasing: "easeOutBounce", //Boolean - Whether we animate the rotation of the Doughnut animateRotate: true, //Boolean - Whether we animate scaling the Doughnut from the centre animateScale: false, //Boolean - whether to make the chart responsive to window resizing responsive: true, // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container maintainAspectRatio: false, //String - A legend template legendTemplate: "", //String - A tooltip template tooltipTemplate: "<%=value %> <%=label%> " }; //----------------- //- END PIE CHART - //----------------- var baseUrl = $('meta[name="baseUrl"]').attr('content'); (function ($, settings) { var Components = {}; Components.modals = {}; // confirm restore modal Components.modals.confirmRestore = function () { var $el = $('table'); var events = { 'click': function click(evnt) { var $context = $(this); var $restoreConfirmModal = $('#restoreConfirmModal'); var href = $context.attr('href'); var message = $context.attr('data-content'); var title = $context.attr('data-title'); $('#restoreConfirmModalLabel').text(title); $restoreConfirmModal.find('.modal-body').text(message); $('#restoreForm').attr('action', href); $restoreConfirmModal.modal({ show: true }); return false; } }; var render = function render() { $el.on('click', '.restore-asset', events['click']); }; return { render: render }; }; // confirm delete modal Components.modals.confirmDelete = function () { var $el = $('table'); var events = { 'click': function click(evnt) { var $context = $(this); var $dataConfirmModal = $('#dataConfirmModal'); var href = $context.attr('href'); var message = $context.attr('data-content'); var title = $context.attr('data-title'); $('#myModalLabel').text(title); $dataConfirmModal.find('.modal-body').text(message); $('#deleteForm').attr('action', href); $dataConfirmModal.modal({ show: true }); return false; } }; var render = function render() { $el.on('click', '.delete-asset', events['click']); }; return { render: render }; }; /** * Application start point * Component definition stays out of load event, execution only happens. */ $(function () { new Components.modals.confirmRestore().render(); new Components.modals.confirmDelete().render(); }); })(jQuery, window.snipeit.settings); $(document).ready(function () { /* * Slideout help menu */ $('.slideout-menu-toggle').on('click', function (event) { event.preventDefault(); // create menu variables var slideoutMenu = $('.slideout-menu'); var slideoutMenuWidth = $('.slideout-menu').width(); // toggle open class slideoutMenu.toggleClass("open"); // slide menu if (slideoutMenu.hasClass("open")) { slideoutMenu.show(); slideoutMenu.animate({ right: "0px" }); } else { slideoutMenu.animate({ right: -slideoutMenuWidth }, "-350px"); slideoutMenu.fadeOut(); } }); /* * iCheck checkbox plugin */ $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({ checkboxClass: 'icheckbox_minimal-blue', radioClass: 'iradio_minimal-blue' }); /* * Select2 */ var iOS = /iPhone|iPad|iPod/.test(navigator.userAgent) && !window.MSStream; if (!iOS) { // Vue collision: Avoid overriding a vue select2 instance // by checking to see if the item has already been select2'd. $('select.select2:not(".select2-hidden-accessible")').each(function (i, obj) { { $(obj).select2(); } }); } // $('.datepicker').datepicker(); // var datepicker = $.fn.datepicker.noConflict(); // return $.fn.datepicker to previously assigned value // $.fn.bootstrapDP = datepicker; // $('.datepicker').datepicker(); // Crazy select2 rich dropdowns with images! $('.js-data-ajax').each(function (i, item) { var link = $(item); var endpoint = link.data("endpoint"); var select = link.data("select"); link.select2({ /** * Adds an empty placeholder, allowing every select2 instance to be cleared. * This placeholder can be overridden with the "data-placeholder" attribute. */ placeholder: '', allowClear: true, ajax: { // the baseUrl includes a trailing slash url: baseUrl + 'api/v1/' + endpoint + '/selectlist', dataType: 'json', delay: 250, headers: { "X-Requested-With": 'XMLHttpRequest', "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content') }, data: function data(params) { var data = { search: params.term, page: params.page || 1, assetStatusType: link.data("asset-status-type") }; return data; }, /* processResults: function (data, params) { params.page = params.page || 1; var answer = { results: data.items, pagination: { more: data.pagination.more } }; return answer; }, */ cache: true }, //escapeMarkup: function (markup) { return markup; }, // let our custom formatter work templateResult: formatDatalistSafe //templateSelection: formatDataSelection }); }); function getSelect2Value(element) { // if the passed object is not a jquery object, assuming 'element' is a selector if (!(element instanceof jQuery)) element = $(element); var select = element.data("select2"); // There's two different locations where the select2-generated input element can be. searchElement = select.dropdown.$search || select.$container.find(".select2-search__field"); var value = searchElement.val(); return value; } $(".select2-hidden-accessible").on('select2:selecting', function (e) { var data = e.params.args.data; var isMouseUp = false; var element = $(this); var value = getSelect2Value(element); if (e.params.args.originalEvent) isMouseUp = e.params.args.originalEvent.type == "mouseup"; // if selected item does not match typed text, do not allow it to pass - force close for ajax. if (!isMouseUp) { if (value.toLowerCase() && data.text.toLowerCase().indexOf(value) < 0) { e.preventDefault(); element.select2('close'); // if it does match, we set a flag in the event (which gets passed to subsequent events), telling it not to worry about the ajax } else if (value.toLowerCase() && data.text.toLowerCase().indexOf(value) > -1) { e.params.args.noForceAjax = true; } } }); $(".select2-hidden-accessible").on('select2:closing', function (e) { var element = $(this); var value = getSelect2Value(element); var noForceAjax = false; var isMouseUp = false; if (e.params.args.originalSelect2Event) noForceAjax = e.params.args.originalSelect2Event.noForceAjax; if (e.params.args.originalEvent) isMouseUp = e.params.args.originalEvent.type == "mouseup"; if (value && !noForceAjax && !isMouseUp) { var endpoint = element.data("endpoint"); var assetStatusType = element.data("asset-status-type"); $.ajax({ url: baseUrl + 'api/v1/' + endpoint + '/selectlist?search=' + value + '&page=1' + (assetStatusType ? '&assetStatusType=' + assetStatusType : ''), dataType: 'json', headers: { "X-Requested-With": 'XMLHttpRequest', "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr('content') } }).done(function (response) { var currentlySelected = element.select2('data').map(function (x) { return +x.id; }).filter(function (x) { return x !== 0; }); // makes sure we're not selecting the same thing twice for multiples var filteredResponse = response.results.filter(function (item) { return currentlySelected.indexOf(+item.id) < 0; }); var first = currentlySelected.length > 0 ? filteredResponse[0] : response.results[0]; if (first && first.id) { first.selected = true; if ($("option[value='" + first.id + "']", element).length < 1) { var option = new Option(first.text, first.id, true, true); element.append(option); } else { var isMultiple = element.attr("multiple") == "multiple"; element.val(isMultiple ? element.val().concat(first.id) : element.val(first.id)); } element.trigger('change'); element.trigger({ type: 'select2:select', params: { data: first } }); } }); } }); function formatDatalist(datalist) { var loading_markup = ' Loading...'; if (datalist.loading) { return loading_markup; } var markup = '
'; markup += '
'; if (datalist.image) { markup += "
" + datalist.text + "
"; } else { markup += '
'; } markup += "
" + datalist.text + "
"; markup += "
"; return markup; } function formatDatalistSafe(datalist) { // console.warn("What in the hell is going on with Select2?!?!!?!?"); // console.warn($.select2); if (datalist.loading) { return $(' Loading...'); } var root_div = $("
"); var left_pull = $("
"); if (datalist.image) { var inner_div = $("
"); /****************************************************************** * * We are specifically chosing empty alt-text below, because this * image conveys no additional information, relative to the text * that will *always* be there in any select2 list that is in use * in Snipe-IT. If that changes, we would probably want to change * some signatures of some functions, but right now, we don't want * screen readers to say "HP SuperJet 5000, .... picture of HP * SuperJet 5000..." and so on, for every single row in a list of * assets or models or whatever. * *******************************************************************/ var img = $(""); // console.warn("Img is: "); // console.dir(img); // console.warn("Strigularly, that's: "); // console.log(img); img.attr("src", datalist.image); inner_div.append(img); } else { var inner_div = $("
"); } left_pull.append(inner_div); root_div.append(left_pull); var name_div = $("
"); name_div.text(datalist.text); root_div.append(name_div); var safe_html = root_div.get(0).outerHTML; var old_html = formatDatalist(datalist); if (safe_html != old_html) {//console.log("HTML MISMATCH: "); //console.log("FormatDatalistSafe: "); // console.dir(root_div.get(0)); //console.log(safe_html); //console.log("FormatDataList: "); //console.log(old_html); } return root_div; } function formatDataSelection(datalist) { // This a heinous workaround for a known bug in Select2. // Without this, the rich selectlists are vulnerable to XSS. // Many thanks to @uberbrady for this fix. It ain't pretty, // but it resolves the issue until Select2 addresses it on their end. // // Bug was reported in 2016 :{ // https://github.com/select2/select2/issues/4587 return datalist.text.replace(/>/g, '>').replace(/Click me $('a[data-toggle="tab"]').click(function (e) { var href = $(this).attr("href"); history.pushState(null, null, href); e.preventDefault(); $('a[href="' + $(this).attr('href') + '"]').tab('show'); }); // ------------------------------------------------ // End Deep Linking for Bootstrap tabs // ------------------------------------------------ // Image preview function readURL(input, $preview) { if (input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function (e) { $preview.attr('src', e.target.result); }; reader.readAsDataURL(input.files[0]); } } function formatBytes(bytes) { if (bytes < 1024) return bytes + " Bytes";else if (bytes < 1048576) return (bytes / 1024).toFixed(2) + " KB";else if (bytes < 1073741824) return (bytes / 1048576).toFixed(2) + " MB";else return (bytes / 1073741824).toFixed(2) + " GB"; } // File size validation $('.js-uploadFile').bind('change', function () { var $this = $(this); var id = '#' + $this.attr('id'); var status = id + '-status'; var $status = $(status); var delete_id = $(id + '-deleteCheckbox'); var preview_container = $(id + '-previewContainer'); $status.removeClass('text-success').removeClass('text-danger'); $(status + ' .goodfile').remove(); $(status + ' .badfile').remove(); $(status + ' .previewSize').hide(); preview_container.hide(); $(id + '-info').html(''); var max_size = $this.data('maxsize'); var total_size = 0; for (var i = 0; i < this.files.length; i++) { total_size += this.files[i].size; $(id + '-info').append('' + htmlEntities(this.files[i].name) + ' (' + formatBytes(this.files[i].size) + ') '); } if (total_size > max_size) { $status.addClass('text-danger').removeClass('help-block').prepend(' ').append(' Upload is ' + formatBytes(total_size) + '.'); } else { $status.addClass('text-success').removeClass('help-block').prepend(' '); var $preview = $(id + '-imagePreview'); readURL(this, $preview); $preview.fadeIn(); preview_container.fadeIn(); delete_id.hide(); } }); }); function htmlEntities(str) { return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); } /** * Toggle disabled */ (function ($) { $.fn.toggleDisabled = function (callback) { return this.each(function () { var disabled, $this = $(this); if ($this.attr('disabled')) { $this.removeAttr('disabled'); disabled = false; } else { $this.attr('disabled', 'disabled'); disabled = true; } if (callback && typeof callback === 'function') { callback(this, disabled); } }); }; })(jQuery); /** * Universal Livewire Select2 and iCheck integration * * How to use: * * 1. Set the class of your select2 elements to 'livewire-select2' and your icheck elements to 'livewire-icheck' (as appropriate). * (For iCheck, you may still need to apply the other iCheck classes like 'minimal' or 'iCheck') * 2. Name your element to match a property in your Livewire component * 3. Add an attribute called 'data-livewire-component' that points to $_instance->id (via `{{ }}` if you're in a blade, * or just $_instance->id if not). * 4. For iCheck, you need to wrap the 'checkbox' element with wire:ignore - perhaps in the