Костыль в CRM Есть решение

1

Обнаружил один не хороший и не документированный костыль в crm.js

$(document).on("click", "a", function(event) {
            var $link = $(this),
                href = $link.attr("href");

            // hack for jqeury ui links without href attr
            if (!href) {
                $link.attr("href", "javascript:void(0);");
                href = $link.attr("href");
            }

            var stop_load = $link.hasClass("js-disable-router"),
                is_app_url = ( this.href.substr(0, full_app_url.length) == full_app_url ),
                is_normal_url = ( !(href === "#" || href.substr(0, 11) === "javascript:") ),
                use_content_router = ( that.is_enabled && !stop_load && is_app_url && is_normal_url );

            if (!event.ctrlKey && !event.shiftKey && !event.metaKey && use_content_router) {
                event.preventDefault();

                var content_uri = this.href;

                if (that.need_confirm) {
                    $.crm.confirm.show({
                        title: $.crm.locales["unsaved_dialog_title"],
                        text: $.crm.locales["unsaved_dialog_text"],
                        button: $.crm.locales["unsaved_dialog_button"],
                        onConfirm: function() {
                            $(document).trigger("unsavedChanges", false);
                            that.load(content_uri);
                        }
                    })

                } else {
                    that.load(content_uri);
                }

            }
        });

Получается, что, если не добавить к ссылке класс "js-disable-router" то ни одна ссылка не сможет открыться в новой вкладке.

Это как бы затрудняет написание новых плагинов под crm. Предлагаю либо все подобные костыли задокументировать, либо убрать эти костыли и наоборот добавить класс, который будет задействовать роутер, а все, что без этого класса, пусть работает как ему положено работать.

4 комментария

  • +1
    Михаил Ушенин Михаил Ушенин Webasyst 30 августа 2022 18:31 #
    Это как бы затрудняет написание новых плагинов под crm.

    Покажите на конкретном примере, чем именно затрудняется разработка плагинов.

    • +1
      ITFrogs ITFrogs 30 августа 2022 19:01 #

      Тем, что я пишу плагин, делаю в нем кнопочки, которые должны открывать новые вкладки,  но они открываются в области контента crm. Пока я разобрался в чем дело, пока нашел этот класс у вас в коде, потратил кучу времени. Это совершенно не очевидно было. Это мне коллеги подсказали что надо эвенты на ссылках посмотреть.


      Ну ладно, я тупой, бог с ним, а вот, если я захочу внутри crm применить какой-нибудь ui для интерфейса, то этот эвент на абсолютно все ссылки crm однозначно все сломает.

    • +1
      Anton F Anton F 30 августа 2022 21:57 #

      просто используй относительные ссылки, тогда is_app_url будет false

      • +1
        ITFrogs ITFrogs 31 августа 2022 21:01 #

        Все эти рецепты касаются того момента, когда ты уже во всем разобрался. Я просто класс к ссылке добавил. Но изначально вся эта ерунда потрепала нервы. А так, я считаю, быть не должно.

        Добавить комментарий

        Чтобы добавить комментарий, зарегистрируйтесь или войдите