https://t.me/RX1948
Server : Apache/2.4.18 (Ubuntu)
System : Linux canvaswebdesign 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64
User : oppastar ( 1041)
PHP Version : 7.0.33-0ubuntu0.16.04.15
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
Directory :  /var/www/laciasmara.com/public_html/shop/application/views/admin/link/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/laciasmara.com/public_html/shop/application/views/admin/link/index.php
<!-- Link Generator Page -->
<div class="container-fluid">
    <!-- Header Section -->
    <div class="row">
        <div class="col-sm-12">
            <ol class="breadcrumb">
                <li><a href="<?= base_url('admin/promotion'); ?>"><i class="fa fa-arrow-left"></i> Kembali ke Promosi</a></li>
                <li class="active">Link Generator</li>
            </ol>

            <!-- Alert Messages -->
            <?php if ($this->session->flashdata('success')): ?>
                <div class="alert alert-success alert-dismissible">
                    <button type="button" class="close" data-dismiss="alert">&times;</button>
                    <?= $this->session->flashdata('success'); ?>
                </div>
            <?php endif; ?>

            <?php if ($this->session->flashdata('error')): ?>
                <div class="alert alert-danger alert-dismissible">
                    <button type="button" class="close" data-dismiss="alert">&times;</button>
                    <?= $this->session->flashdata('error'); ?>
                </div>
            <?php endif; ?>
        </div>
    </div>

    <!-- Main Content -->
    <div class="row">
        <div class="col-sm-6">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">Generate UTM Link</h3>
                </div>
                <div class="panel-body">
                    <form id="linkGeneratorForm">
                        <!-- Link Type Selection -->
                        <div class="form-group">
                            <label>Jenis Link – Pilih jenis halaman yang akan ditautkan</label>
                            <select class="form-control" id="linkType" required>
                                <option value="">Pilih Jenis Link</option>
                                <option value="product">Produk – Link langsung ke produk tertentu</option>
                                <option value="brand">Merek – Link ke halaman merek tertentu</option>
                                <option value="category">Kategori – Link ke halaman kategori produk</option>
                            </select>
                        </div>

                        <!-- Search and Selection Area -->
                        <div class="form-group" id="searchArea" style="display: none;">
                            <label>Cari <span id="searchLabel">Product</span></label>
                            <div class="input-group">
                                <input type="text" class="form-control" id="searchInput" placeholder="Ketik untuk mencari...">
                                <span class="input-group-addon"><i class="fa fa-search"></i></span>
                            </div>
                            <div class="list-group" id="searchResults" style="max-height: 200px; overflow-y: auto; margin-top: 10px;">
                                <!-- Results will be populated here -->
                            </div>
                        </div>

                        <!-- UTM Parameters -->
                        <div class="form-group">
                            <label>Sumber Trafik (Source) – Dari mana pengunjung datang?</label>
                            <div class="source-container">
                                <button type="button" class="source-btn" data-value="facebook">
                                    <img src="https://cdn-icons-png.flaticon.com/128/174/174848.png" alt="Facebook">
                                    <span>Facebook</span>
                                </button>
                                <button type="button" class="source-btn" data-value="instagram">
                                    <img src="https://cdn-icons-png.flaticon.com/128/15713/15713420.png" alt="Instagram">
                                    <span>Instagram</span>
                                </button>
                                <button type="button" class="source-btn" data-value="youtube">
                                    <img src="https://cdn-icons-png.flaticon.com/128/5968/5968852.png" alt="Youtube">
                                    <span>Youtube</span>
                                </button>
                                <button type="button" class="source-btn" data-value="linkedin">
                                    <img src="https://cdn-icons-png.flaticon.com/128/3536/3536505.png" alt="Linkedin">
                                    <span>Linkedin</span>
                                </button>
                                <button type="button" class="source-btn" data-value="googleads">
                                    <img src="https://cdn-icons-png.flaticon.com/128/2875/2875421.png" alt="Google Ads">
                                    <span>Google Ads</span>
                                </button>
                                <button type="button" class="source-btn" data-value="metaads">
                                    <img src="https://cdn-icons-png.flaticon.com/128/6033/6033716.png" alt="Meta">
                                    <span>Meta Ads</span>
                                </button>
                                <button type="button" class="source-btn" data-value="tiktok">
                                    <img src="https://cdn-icons-png.flaticon.com/128/15713/15713399.png" alt="TikTok">
                                    <span>TikTok</span>
                                </button>
                            </div>
                            <input type="hidden" id="utmSource" name="utmSource">
                        </div>


                        <div class="form-group">
                            <label>Jenis Trafik (Medium) – Bagaimana mereka menemukan link ini?</label>
                            <input type="text" class="form-control" id="utmMedium" placeholder="Contoh: cpc, banner" required>
                        </div>

                        <div class="form-group">
                            <label>Nama Promosi (Campaign) – Nama promosi atau kampanye yang sedang berjalan</label>
                            <input type="text" class="form-control" id="utmCampaign" placeholder="Contoh: valentine" required>
                        </div>

                        <div class="form-group">
                            <label>Konten Iklan (Content) – Gunakan untuk membedakan variasi iklan dalam kampanye yang sama</label>
                            <input type="text" class="form-control" id="utmContent" placeholder="Contoh: cta-button, header-banner">
                        </div>
                        <div class="form-group">
                            <label>Kata Kunci (Term) – Kata kunci yang digunakan dalam iklan berbayar</label>
                            <input type="text" class="form-control" id="utmTerm" placeholder="Contoh: vibrator+satisfyer">
                        </div>

                        <button type="submit" class="btn btn-primary btn-block">
                            <i class="fa fa-magic"></i> Generate Link
                        </button>
                    </form>
                </div>
            </div>
        </div>

        <div class="col-sm-6">
            <!-- Generated Link Result -->
            <div class="panel panel-success" id="resultPanel" style="display: none;">
                <div class="panel-heading">
                    <h3 class="panel-title">Link Generated</h3>
                </div>
                <div class="panel-body">
                    <div class="form-group">
                        <label>Generated Link</label>
                        <div class="input-group">
                            <input type="text" class="form-control" id="generatedLink" readonly>
                            <span class="input-group-btn">
                                <button class="btn btn-default" type="button" id="copyButton">
                                    <i class="fa fa-copy"></i> Copy
                                </button>
                            </span>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Recent Generated Links -->
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">Recently Generated Links</h3>
                </div>
                <div class="panel-body">
                    <div class="table-responsive">
                        <table class="table table-hover">
                            <thead>
                                <tr>
                                    <th>Type</th>
                                    <th>Generated Link</th>
                                    <th>Action</th>
                                </tr>
                            </thead>
                            <tbody id="recentLinks">
                                <!-- Recent links will be populated here -->
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- JavaScript for interactivity -->
<script>
    const BASE_URLS = {
        product: '<?= base_url('admin/search/product'); ?>',
        brand: '<?= base_url('admin/search/brand'); ?>',
        category: '<?= base_url('admin/search/category'); ?>'
    };

    const CSRF_TOKEN = "<?= $this->security->get_csrf_token_name(); ?>";
    const CSRF_HASH = "<?= $this->security->get_csrf_hash(); ?>";

    $(document).ready(function() {
        loadRecentLinks();

        // Handle link type selection
        $('#linkType').change(function() {
            const selectedType = $(this).val();

            $('#searchInput').val('');
            $('#searchResults').empty();

            if (selectedType) {
                $('#searchArea').show();
                $('#searchLabel').text(selectedType.charAt(0).toUpperCase() + selectedType.slice(1));
                let placeholder = '';
                switch (selectedType) {
                    case 'product':
                        placeholder = 'Cari produk...';
                        break;
                    case 'brand':
                        placeholder = 'Cari merek...';
                        break;
                    case 'category':
                        placeholder = 'Cari kategori...';
                        break;
                }
                $('#searchInput').attr('placeholder', placeholder);
            } else {
                $('#searchArea').hide();
            }
        });

        $('#searchInput').on('input', async function() {
            const query = $(this).val().trim();
            const type = $('#linkType').val();
            if (query.length < 2 || !type) return;

            const BASE_URL = BASE_URLS[type]; // Tentukan endpoint sesuai tipe link
            const requestData = {
                query
            };

            try {
                const results = await makeRequest(BASE_URL, requestData);
                console.log(results);
                updateSearchResults(results);
            } catch (error) {
                console.error('Error fetching search results:', error);
            }
        });

        const updateSearchResults = (results) => {
            const $resultsContainer = $('#searchResults');
            $resultsContainer.empty();

            if (results.length === 0) {
                $resultsContainer.append('<div class="list-group-item">Tidak ada hasil ditemukan</div>');
                return;
            }

            results.forEach(item => {
                const resultItem = `
                    <label class="list-group-item">
                        <input type="checkbox" class="search-checkbox" value="${item.id}" data-name="${item.name}" data-url="${item.url}">
                        ${item.name}
                    </label>`;
                $resultsContainer.append(resultItem);
            });
        };

        // Menyimpan item yang dipilih
        const selectedItems = new Set();

        $('#searchResults').on('change', '.search-checkbox', function() {
            // Uncheck semua checkbox kecuali yang dipilih
            $('.search-checkbox').not(this).prop('checked', false);

            // Kosongkan selectedItems karena hanya boleh ada satu item
            selectedItems.clear();

            if ($(this).is(':checked')) {
                const itemId = $(this).val();
                const itemName = $(this).data('name');
                const itemUrl = $(this).data('url');

                selectedItems.add({
                    id: itemId,
                    name: itemName,
                    url: itemUrl,
                });
            }
        });


        // Handle form submission
        $('#linkGeneratorForm').submit(async function(e) {
            e.preventDefault();

            // Validasi input
            const source = $('#utmSource').val().trim();
            const medium = $('#utmMedium').val().trim();
            const campaign = $('#utmCampaign').val().trim();
            const content = $('#utmContent').val().trim();
            const term = $('#utmTerm').val().trim(); // Opsional, hanya untuk iklan berbayar

            if (!source || !medium || !campaign) {
                alert('Mohon lengkapi semua field UTM parameters');
                return;
            }

            // Validasi item yang dipilih
            if (selectedItems.size === 0) {
                alert('Mohon pilih setidaknya satu item');
                return;
            }

            // Get first selected item (bisa dimodifikasi jika ingin support multiple items)
            const selectedItem = Array.from(selectedItems)[0];

            // Generate UTM link
            const generatedLink = generateUtmLink(
                selectedItem.url,
                source,
                medium,
                campaign,
                content,
                term
            );

            try {
                // Simpan ke database
                const saveResponse = await makeRequest('<?= base_url("admin/link/save_link") ?>', {
                    url: generatedLink,
                    item_id: selectedItem.id,
                    item_type: $('#linkType').val(),
                    utm_source: source,
                    utm_medium: medium,
                    utm_campaign: campaign,
                    utm_content: content,
                    utm_term: term
                });

                if (saveResponse.success) {
                    // Tampilkan hasil
                    $('#generatedLink').val(generatedLink);
                    $('#resultPanel').show();
                    loadRecentLinks();
                } else {
                    throw new Error(saveResponse.message);
                }
            } catch (error) {
                console.error('Error saving link:', error);
                alert('Gagal menyimpan link: ' + error.message);
            }
        });

        // Handle copy button
        $('#copyButton').click(function() {
            var copyText = document.getElementById("generatedLink");
            copyText.select();
            document.execCommand("copy");

            // Show feedback
            $(this).tooltip({
                title: "Copied!",
                trigger: "manual"
            }).tooltip("show");

            setTimeout(function() {
                $('#copyButton').tooltip("destroy");
            }, 1000);
        });

    });

    $(document).on('click', '.copy-btn', function() {
        // Get the link from the button's data-link attribute
        var copyText = $(this).data('link');

        // Create a temporary input element to copy the text
        var $tempInput = $('<input>');
        $('body').append($tempInput);
        $tempInput.val(copyText).select();
        document.execCommand('copy');
        $tempInput.remove();

        // Show feedback tooltip
        $(this).tooltip({
            title: "Copied!",
            trigger: "manual"
        }).tooltip("show");

        // Destroy the tooltip after 1 second
        setTimeout(function() {
            $(this).tooltip("destroy");
        }.bind(this), 1000); // `bind(this)` ensures the correct `this` context
    });

    document.querySelectorAll('.source-btn').forEach(button => {
        button.addEventListener('click', function() {
            document.getElementById('utmSource').value = this.dataset.value;
            document.querySelectorAll('.source-btn').forEach(btn => btn.classList.remove('selected'));
            this.classList.add('selected');
        });
    });

    async function loadRecentLinks() {
        try {
            // Send the request to fetch recent links
            const response = await makeRequest('<?= base_url("admin/link/get_recent_links") ?>', {});

            // Clear any existing links in the table
            const recentLinksTableBody = document.getElementById('recentLinks');
            recentLinksTableBody.innerHTML = '';

            // Loop through the results and add them to the table
            response.forEach(link => {
                addToRecentLinks({
                    type: link.item_type,
                    link: link.url
                });
            });
        } catch (error) {
            console.error('Error loading recent links:', error);
        }
    }

    function addToRecentLinks(linkData) {
        const newRow = `
            <tr>
                <td>${linkData.type}</td>
                <td class="text-truncate" style="max-width: 200px;">${linkData.link}</td>
                <td>
                    <button class="btn btn-xs btn-default copy-btn" type="button" data-link="${linkData.link}">
                        <i class="fa fa-copy"></i>
                    </button>
                </td>
            </tr>
        `;
        // Append the new row to the table
        const recentLinksTableBody = document.getElementById('recentLinks');
        recentLinksTableBody.insertAdjacentHTML('beforeend', newRow);
    }

    // Generate Function 
    function generateUtmLink(baseUrl, source, medium, campaign, content, term) {
        const utmParams = new URLSearchParams({
            utm_source: source,
            utm_medium: medium,
            utm_campaign: campaign
        });

        // Tambahkan utm_content jika diisi
        if (content) {
            utmParams.append("utm_content", content);
        }

        // Tambahkan utm_term jika diisi
        if (term) {
            utmParams.append("utm_term", term);
        }

        // Jika utm_source adalah "googleads", hanya tampilkan parameter UTM tanpa baseUrl
        if (source.toLowerCase() === "googleads") {
            return `?${utmParams.toString()}`.toLowerCase();
        }

        return `${baseUrl}?${utmParams.toString()}`.toLowerCase();
    }
    // Fungsi helper untuk membuat form data dengan CSRF
    const createFormData = (data) => {
        const formData = new FormData();
        formData.append(CSRF_TOKEN, CSRF_HASH);
        Object.keys(data).forEach(key => {
            if (key === 'orderDetailData') {
                formData.append(key, JSON.stringify(data[key]));
            } else {
                formData.append(key, data[key]);
            }
        });
        return formData;
    };

    // Fungsi helper untuk request
    const makeRequest = async (url, data) => {
        const formData = createFormData(data);
        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'X-Requested-With': 'XMLHttpRequest'
            },
            body: formData
        });
        return response.json();
    };
</script>

<style>
    /* Styling container agar responsif */
    .text-truncate {
        overflow: hidden;
        /* Hide the overflowed content */
        white-space: nowrap;
        /* Prevent the text from wrapping to the next line */
        text-overflow: ellipsis;
        /* Show ellipsis (...) when the text overflows */
    }

    .source-container {
        display: flex;
        flex-wrap: wrap;
        gap: 10px;
        color: #333;
    }

    /* Styling tombol */
    .source-btn {
        display: flex;
        align-items: center;
        justify-content: center;
        width: max-content;
        height: 40px;
        padding: 10px;
        border: 2px solid #ddd;
        background: white;
        cursor: pointer;
        border-radius: 10px;
        text-align: center;
        transition: all 0.3s ease-in-out;
        font-size: 14px;
        font-weight: bold;
        gap: 8px;
    }

    /* Hover effect */
    .source-btn:hover {
        border-color: #7A4397;
        transform: scale(1.05);
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
    }

    /* Pilihan aktif */
    .source-btn.selected {
        background: #7A4397;
        color: white;
        border-color: #7A4397;
        transform: scale(1.05);
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
    }

    /* Styling ikon */
    .source-btn img {
        width: 24px;
        height: 24px;
        transition: transform 0.2s ease-in-out;
    }

    /* Efek hover untuk ikon */
    .source-btn:hover img {
        transform: scale(1.1);
    }
</style>

https://t.me/RX1948 - 2025