Your IP : 216.73.217.77


Current Path : /home/users/unlimited/www/whatsjet-saas/Source/resources/js/services/__jsware/
Upload File :
Current File : /home/users/unlimited/www/whatsjet-saas/Source/resources/js/services/__jsware/plugin-services.js

(function (window, $) {
    "use strict"; // Start of use strict
    /**
         * lw plugin functions container in window scope
         *
         * @var {object}
         */
    window.lwPluginFuncs = {
        /**
         * Initialize Date Picker
         *
         * @param  string  elementFinder  element identifier
         * @see https://amsul.ca/pickadate.js/date/
         * @return  void
         */
        lwDatePicker: function (elementFinder) {
            $(elementFinder).each(function (index, datePickerFieldElement) {
                var $datePickerFieldElement = $(datePickerFieldElement),
                    datePickerData = $($datePickerFieldElement).data();
                if (datePickerData) {
                    datePickerData = _.assign({
                        format: 'd mmmm yyyy',
                        formatSubmit: 'yyyy-mm-dd',
                        hiddenName: true
                    }, datePickerData);
                }
                $($datePickerFieldElement).pickadate(datePickerData);
                $datePickerFieldElement = datePickerFieldElement = datePickerData = null;
            });
            elementFinder = null;
        },
        /**
         * Initialize Time Picker
         *
         * @param  string  elementFinder  element identifier
         * @see https://amsul.ca/pickadate.js/date/
         * @return  void
         */
        lwTimePicker: function (elementFinder) {
            $(elementFinder).each(function (index, datePickerFieldElement) {
                var $datePickerFieldElement = $(datePickerFieldElement),
                    timePickerData = $($datePickerFieldElement).data();
                if (timePickerData) {
                    timePickerData = _.assign({
                        format: 'h:i A',
                        formatSubmit: 'HH:i',
                        hiddenName: true
                    }, timePickerData);
                }
                $($datePickerFieldElement).pickatime(timePickerData);
                $datePickerFieldElement = datePickerFieldElement = timePickerData = null;
            });
            elementFinder = null;
        },
        /**
         * Initialize Switchery
         *
         * @param  string  elementFinder  element identifier
         *
         * @return  void
         */
        lwSwitchery: function (elementFinder) {
            $(elementFinder).each(function (index, switcheryFieldElement) {
                var $switcheryFieldElement = $(switcheryFieldElement),
                    isAlreadyInitialized = $switcheryFieldElement.siblings('.switchery').length,
                    switcheryData = $($switcheryFieldElement).data();
                if (!isAlreadyInitialized) {
                    if (switcheryData) {
                        switcheryData = _.assign({
                            // color             : '#64bd63',
                            // secondaryColor    : '#dfdfdf',
                            // jackColor         : '#fff',
                            // jackSecondaryColor: null,
                            // className         : 'switchery',
                            // disabled          : false,
                            // disabledOpacity   : 0.5,
                            // speed             : '0.4s',
                            // size              : 'default',
                        }, switcheryData);
                    }
                    new Switchery($switcheryFieldElement[0], switcheryData);
                }
                $switcheryFieldElement = switcheryFieldElement = switcheryData = null;
            });
            elementFinder = null;
        },
        /**
     * Initialize Selectize
     *
     * @param   {string}  elementFinder  element identifier
     *
     * @notes use select for single selection and use input text for multiple selection
     * @return  {void}
     */
        lwSelectize: function (elementFinder) {
            $(elementFinder).each(function (index, selectizeFieldElement) {
                var $selectizeFieldElement = $(selectizeFieldElement);
                var options = {
                        onChange: function (value) {
                            var itemToUpdate = {},
                                inputModelName = $(this.$input[0]).attr('x-model');
                            // Update x-model value if present
                            if (inputModelName) {
                                itemToUpdate[inputModelName] = value;
                                __DataRequest.updateModels(itemToUpdate);
                            }
                            // dispatch event for change to grab
                            $(this.$input[0]).trigger('lwSelectizeOnChange', value);
                        }
                    },
                    selectizeFieldElementData = $selectizeFieldElement.data();
                if (selectizeFieldElementData) {
                    if (selectizeFieldElementData['selected']) {
                        options.items = _.isArray(selectizeFieldElementData['selected']) ? selectizeFieldElementData['selected'] : [selectizeFieldElementData['selected']];
                    }
                    options = _.assign(options, selectizeFieldElementData);
                }
                // use options eg. data-create="true" on the particular element
                try {
                    options.options = $.parseJSON($selectizeFieldElement.attr('data-options'));
                } catch (error) {
                    options.options = $selectizeFieldElement.attr('data-options');
                }
                $($selectizeFieldElement).selectize(options);
                // clear the memory
                options = $selectizeFieldElement = selectizeFieldElementData = selectizeFieldElement = null;
            });
            elementFinder = null;
        },

        /**
         * Initialize Signature Pad
         *
         * @param  string  elementFinder  element identifier
         *
         * @return  void
         */
        lwSignaturePad: function (elementFinder) {
            $(elementFinder).each(function (index, fieldElement) {
                var $fieldElement = $(fieldElement),
                    optionsData = $fieldElement.data(),
                    $inputField = $fieldElement.siblings('.lw-signature-input-field');
                if (!$inputField.val()) {
                    if (optionsData) {
                        optionsData = _.assign({
                            onEnd: function () {
                                var data = signaturePad.toDataURL('image/png');
                                $inputField.val(data);
                                // Send data to server instead...
                            }
                        }, optionsData);
                    }
                    var signaturePad = new SignaturePad(fieldElement, optionsData);
                    $fieldElement.parent().on('click', '.lw-clear-signature-btn', function (event) {
                        event.preventDefault();
                        $inputField.val('');
                        signaturePad.clear();
                    });
                    optionsData = null;

                    function resizeCanvas() {
                        var ratio = Math.max(window.devicePixelRatio || 1, 1);
                        fieldElement.width = fieldElement.offsetWidth * ratio;
                        fieldElement.height = fieldElement.offsetHeight * ratio;
                        fieldElement.getContext("2d").scale(ratio, ratio);
                        signaturePad.clear(); // otherwise isEmpty() might return incorrect value
                    }
                    window.addEventListener("resize", resizeCanvas);
                    resizeCanvas();
                }
            });
            elementFinder = null;
        },
        /**
         * Initialize text editor
         *
         * @param  string  elementFinder  element identifier
         * @see https://alex-d.github.io/Trumbowyg/documentation
         * @return  void
         */
        lwTextEditor: function (elementFinder) {
            $(elementFinder).each(function (index, textEditorFieldElement) {
                var $textEditorFieldElement = $(textEditorFieldElement),
                    textEditorData = $($textEditorFieldElement).data();
                if ($textEditorFieldElement.trumbowyg) {
                    $textEditorFieldElement.trumbowyg('destroy');
                }
                // icons path
                $textEditorFieldElement.trumbowyg({
                    btns: [
                        ['indent', 'outdent',],
                        ['unorderedList', 'orderedList'],
                    ],
                    autogrow: true
                });

            });
            elementFinder = null;
        },
        /**
         * Initialize Uploader
         *
         * @param  string  elementFinder  element identifier
         * @see Filepond
         * @return  void
         */
        lwUploader: function (elementFinder) {
            if (window['FilePond']) {
                FilePond.registerPlugin(
                    FilePondPluginImagePreview,
                    FilePondPluginFilePoster,
                    FilePondPluginFileValidateType
                );
                $(elementFinder).each(function (index, uploader) {
                    var $this = $(this);
                    var actionUrl = $this.data('action'),
                        responseCallback = $this.data('callback'),
                        defaultImage = $this.data('default-image-url'),
                        removeMediaAfterUpload = $this.data('remove-media'),
                        removeAllMediaAfterUpload = $this.data('remove-all-media'),
                        allowedMediaExtension = $this.data('allowed-media'),
                        filePondAdditionalOptions = _.assign({
                            maxParallelUploads: 10,
                            imagePreviewMaxHeight: 175,
                            labelIdle: $this.data('label-idle') ? $this.data('label-idle') : __Utils.getTranslation('uploader_default_text'),
                            acceptedFileTypes: allowedMediaExtension,
                            fileValidateTypeDetectType: function (source, type) {
                                return new Promise(function (resolve, reject) {
                                    if (allowedMediaExtension) {
                                        if (allowedMediaExtension.indexOf(type) < 0) {
                                            reject();
                                        }
                                    }
                                    resolve(type);
                                })
                            },
                            allowRevert: false,
                            allowReplace: false,
                            credits: false,
                            server: {
                                process: {
                                    url: actionUrl,
                                    method: 'POST',
                                    headers: {
                                        'X-CSRF-TOKEN': appConfig.csrf_token
                                    },
                                    withCredentials: false,
                                    onload: function (response) {
                                        var requestData = JSON.parse(response);
                                        // Show message when upload complete
                                        switch (requestData.reaction) {
                                            case 1:
                                                $this.find('.lw-uploaded-file').val(requestData.data.fileName);
                                                showSuccessMessage(requestData.data.message);
                                                break;
                                            case 14:
                                                showWarnMessage(requestData.data.message);
                                                break;
                                            default:
                                                showErrorMessage(requestData.data.message);
                                                break;
                                        }

                                        if ($this.data('file-input-element')) {
                                            var $fileInputElement = $($this.data('file-input-element'));
                                            if ($fileInputElement.length) {
                                                $fileInputElement.val(requestData.data.fileName);
                                            }
                                        }
                                        // use this if you require raw uploaded like original name etc
                                        if ($this.data('raw-upload-data-element')) {
                                            var $rawUploadElement = $($this.data('raw-upload-data-element'));
                                            if ($rawUploadElement.length) {
                                                $rawUploadElement.val(JSON.stringify(requestData.data));
                                            }
                                        }
                                        var responseCallbackFn = window[responseCallback];
                                        if (typeof responseCallbackFn === 'function') {
                                            responseCallbackFn(requestData, $this);
                                        }
                                    },
                                    onerror: function (response) {
                                        var requestData = JSON.parse(response);
                                        // Show message when upload complete
                                        if (requestData.reaction) {
                                            showErrorMessage(requestData.data.message);
                                        }
                                    }
                                }
                            },
                            onprocessfile: function (error, file) {
                                if (removeMediaAfterUpload) {
                                    pond.removeFile(file.id);
                                }
                                if (removeAllMediaAfterUpload) {
                                    pond.removeFiles();
                                }
                            }
                        }, $this.data ? $this.data : {});

                    if (defaultImage && typeof defaultImage != 'undefined' && !_.isEmpty(defaultImage)) {
                        filePondAdditionalOptions = _.assign(filePondAdditionalOptions, {
                            files: [
                                {
                                    // set type to local to indicate an already uploaded file
                                    options: {
                                        type: 'local',
                                        file: {
                                            name: '',
                                            size: uploader.size,
                                            type: 'image/jpg'
                                        },
                                        // Pass Default Image Url
                                        metadata: {
                                            poster: defaultImage
                                        }
                                    }
                                }
                            ]
                        });
                    }

                    var pond = FilePond.create(this, filePondAdditionalOptions);
                });

                elementFinder = null;
            }
        },

        /**
         * Copy to clipboard functionality for text
         *
         * @param  string  elementFinder  element identifier
         * @since 19 APR 2022
         * @return  void
         */
        lwCopyToClipboard: function (elementFinder) {
            $(elementFinder).on('click', function () {
                var copyTextElement = document.getElementById($(this).data('target-id'));
                /* Select the text field */
                copyTextElement.select();
                copyTextElement.setSelectionRange(0, 99999); /* For mobile devices */
                /* Copy the text inside the text field */
                window.navigator.clipboard.writeText(copyTextElement.value);
            });
        },
    };

    window.lwPluginsInit = function (requestedElement) {
        if (!requestedElement) {
            requestedElement = '';
        }
        // default Initialization of plugins
        var $lwPluginFuncsElements = $(requestedElement + '[data-lw-plugin]');
        if ($lwPluginFuncsElements.length) {
            $lwPluginFuncsElements.each(function (index, element) {
                var funcToCall = $(element).data('lw-plugin');
                window.lwPluginFuncs[funcToCall]('[data-lw-plugin=' + funcToCall + ']');
                funcToCall = null;
            });
        }
        $lwPluginFuncsElements = null;
    };
    lwPluginsInit();
})(window, jQuery); // End of use strict