- // ==UserScript==
- // @name Cart - Flip
- // @namespace scriptomatika
- // @author mouse-karaganda
- // @description Опции для корзины
- // @license MIT
- // @include https://*flip.kz/cart*
- // @include https://light.mail.ru/message/*
- // @require https://greasyfork.org/scripts/379902-include-tools/code/Include%20Tools.js
- // @version 1.8
- // @grant none
- // ==/UserScript==
-
- (function() {
- const $ = window.jQuery;
- const $$ = window.__krokodil;
-
- class WhereIs {
- static get inFlipKz() {
- return /flip\.kz\//.test(location.href);
- }
- static get inMailRu() {
- return /mail\.ru\//.test(location.href);
- }
- }
-
- let runInFlipKz = function() {
- if (!WhereIs.inFlipKz) {
- return;
- }
-
- $$.renderStyle(
- '.unavailable_frame { position: fixed; bottom: 0; right: 0; padding: 5px 0 5px 5px; border-radius: 10px 0 0 0; background-color: rgba(10, 121, 213, 0.9); }',
- '.product_frame { display: inline-block; }',
- '.product_frame > div { display: inline-block; }',
- '.product_frame img { width: 32px; border-radius: 5px; }',
- '.product_position { margin-left: 10px; color: white; font-size: 12px; }'
- );
-
- let cartList;
-
- let unavailableFrame = $('<div class="unavailable_frame" />').appendTo(document.body);
- let innerDiv = $('<div />').appendTo(unavailableFrame);
-
- $('<a class="nbtn gray small m-r-10" />').appendTo(innerDiv).text('К недоступному')
- .on('click', function(event) {
- let listExists = (cartList && cartList.length > 0);
- let viewRow = (listExists) ? cartList[0].row : $('#module-cart .row').last();
- //viewRow.get(0).scrollIntoView();
- $('body, html').stop().animate({ scrollTop: viewRow.offset().top }, 300);
- });
-
- $('<a class="nbtn gray small m-r-10" />').appendTo(innerDiv).text('Открыть 3')
- .on('click', function(event) {
- let period = 500;
- setTimeout(function() {
- window.open('', 'manual_postpone0', 'width=450,height=300,left=0,top=0');
- }, 1);
- setTimeout(function() {
- window.open('', 'manual_postpone1', 'width=450,height=300,left=455,top=0');
- }, period);
- setTimeout(function() {
- window.open('', 'manual_postpone2', 'width=450,height=300,left=910,top=0');
- }, period * 2);
- });
-
- let position = {
- auto: {
- timer: 0,
- index: 0,
- length: 0
- },
- cart: {
- index: 0,
- length: 0
- },
- postponed: {
- page: 0,
- length: 0
- }
- };
-
- let autoClickInCart = function() {
- if (position.auto.index >= position.auto.length) {
- clearInterval(position.auto.timer);
- return;
- }
- $('.postpone_frame .nbtn', cartList[position.auto.index].row).get(0).click();
- position.auto.index++;
-
- // Предложим продолжить или прервать
- if ((position.auto.index < position.auto.length) && (position.auto.index % 3 == 0)) {
- if (confirm(`Открыто ${position.auto.index} / ${position.auto.length}.\nПрервать?`)) {
- clearInterval(position.auto.timer);
- }
- }
- };
-
- $('<a class="nbtn gray small m-r-10" />').appendTo(innerDiv).text('Перекликать')
- .on('click', function(event) {
- let listExists = (cartList && cartList.length > 0);
- if (!listExists) {
- return;
- }
- position.auto.length = cartList.length;
- position.auto.index = 0;
- position.auto.timer = setInterval(autoClickInCart, 500);
- });
-
- let productFrame = {
- clear: function() {
- this.outer.empty();
- this.outer.removeAttr('title');
- this.outer.addClass('m-r-10');
- },
- createAgain: function() {
- this.clear();
-
- let div = $('<div />').appendTo(productFrame.outer);
- this.img = $('<img />').appendTo(div);
-
- div = $('<div class="product_position" />').appendTo(productFrame.outer);
- this.name = $('<div />').appendTo(div);
- this.cartIndex = $('<div />').appendTo(div);
- this.postponedPage = $('<div />').appendTo(div);
- },
- setImg: function(product) {
- this.img.attr({
- src: product.img,
- alt: product.id
- });
- },
- setName: function(product) {
- this.name.text(product.name.substring(0, 5) + '…');
- this.outer.attr('title', product.name);
- },
- setCartIndex: function() {
- this.cartIndex.text(`товар ${position.cart.index + 1} / ${position.cart.length}`);
- },
- setPostponedPage: function() {
- this.postponedPage.text(`стр ${position.postponed.page + 1} / ${position.postponed.length}`);
- }
- };
-
- let postponedList = [];
-
- let findInPostponedList = function(productId) {
- let postponedPage = 0;
- };
-
- let currentIndex, maxIndex;
- let currentPage, maxPage;
-
- let requestPostponedItem = function() {
-
- let product = cartList[position.cart.index].product;
-
- productFrame.createAgain();
- productFrame.setImg(product);
- productFrame.setName(product);
- productFrame.setCartIndex();
- productFrame.setPostponedPage();
- return;
-
- currentIndex++;
- if (currentIndex >= maxIndex)
- return;
-
- $.get('/user?personalis=coming&page=' + currentPage, function(data) {
- let rowList = $('.table.goods .row', data);
- console.log('AJAX rowList == ', rowList);
- });
- };
-
- $('<a class="nbtn gray small m-r-10" />').appendTo(innerDiv).text('Проверить')
- .on('click', function(event) {
- let listExists = (cartList && cartList.length > 0);
- if (!listExists) {
- alert('Недоступного нет');
- return;
- }
- position.cart.length = cartList.length;
- position.cart.index = 0;
-
- // Получить список ожидаемых постранично до тех пор, пока не найдем нужный товар
- requestPostponedItem();
- });
-
- productFrame.outer = $('<div class="product_frame" />').appendTo(innerDiv);
-
- class ProductRow {
- constructor(rowElem) {
- this.row = $(rowElem);
- if (this.isCartPage) {
- this.delivery = $('label + div + div', rowElem);
- }
- }
- get isCartPage() {
- return /\/cart\b/.test(location.href);
- }
- get isUnavailable() {
- if (this.delivery) {
- return this.delivery.text().includes('Недоступен для заказа');
- }
- return false;
- }
- get product() {
- if (!this._product) {
- let catalogElem = $('a[href^="/catalog?prod="]', this.row);
- this._product = {
- id: catalogElem.attr('href').match(/prod=(\d+)/)[1],
- img: catalogElem.children('img').attr('src'),
- name: catalogElem.text()
- };
- }
- return this._product;
- }
- addPostponeFrame(winIndex) {
- this.row.addClass('add_postpone_row');
-
- let div = $('<div class="postpone_frame" />').appendTo(this.delivery);
-
- let btnDoPostpone = $('<a class="nbtn gray small" />').appendTo(div).text('Отложить')
- .attr({
- target: 'manual_postpone' + winIndex,
- href: '/subscribe?type=preorder&action=add&id=' + this.product.id
- })
- .on('click', function(event) {
- setTimeout(function() {
- $('<span />').text(' ✅ ').insertAfter(btnDoPostpone);
- }, 500);
- });
- }
- }
-
- cartList = $('#module-cart .table.goods:first-child .row')
- .filter(function(index) {
- let prow = new ProductRow(this);
- return prow.isUnavailable;
- })
- .map(function(index) {
- let prow = new ProductRow(this);
- prow.addPostponeFrame(index % 3);
- return prow;
- })
- .get();
- console.log('cartList [%o] == ', cartList.length);
- };
-
- let runInMailRu = function() {
- if (!WhereIs.inMailRu) {
- return;
- }
- };
-
- runInFlipKz();
- runInMailRu();
-
- console.log('Cart - Flip 💬 1.8');
- })();