代码之家  ›  专栏  ›  技术社区  ›  Lee McAlilly

使用importmaps时,如何自定义Rails 7中的Trix工具栏?

  •  0
  • Lee McAlilly  · 技术社区  · 3 年前

    我最近将一个应用程序升级到了Rails 7,我正在为我的所有javascript使用importmap Rails。之前,该应用程序使用Webpacker,我让所有javascript都通过importmaps工作,除了自定义Trix工具栏以向Trix工具栏添加下划线按钮。为了使用Webpacker实现这一点,我使用了这个JS文件来定制Trix工具栏:

    trix_extensions.js :

    var Trix  = require("trix")
    Trix.config.textAttributes.underline = {
      tagName: 'u'
    }
    const {lang} = Trix.config;
    
    Trix.config.toolbar = {
      getDefaultHTML() { return `
        <div class="trix-button-row">
         <span class="trix-button-group trix-button-group--text-tools" data-trix-button-group="text-tools">
           <button type="button" class="trix-button trix-button--icon trix-button--icon-bold" data-trix-attribute="bold" data-trix-key="b" title="${lang.bold}" tabindex="-1">#{lang.bold}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-italic" data-trix-attribute="italic" data-trix-key="i" title="${lang.italic}" tabindex="-1">${lang.italic}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-strike" data-trix-attribute="strike" title="${lang.strike}" tabindex="-1">${lang.strike}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-underline" data-trix-attribute="underline" data-trix-key="u" title="underline" tabindex="-1">${lang.underline}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-link" data-trix-attribute="href" data-trix-action="link" data-trix-key="k" title="${lang.link}" tabindex="-1">${lang.link}</button>
         </span>
         <span class="trix-button-group trix-button-group--block-tools" data-trix-button-group="block-tools">
           <button type="button" class="trix-button trix-button--icon trix-button--icon-heading-1" data-trix-attribute="heading1" title="${lang.heading1}" tabindex="-1">${lang.heading1}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-quote" data-trix-attribute="quote" title="${lang.quote}" tabindex="-1">${lang.quote}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-bullet-list" data-trix-attribute="bullet" title="${lang.bullets}" tabindex="-1">${lang.bullets}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-number-list" data-trix-attribute="number" title="${lang.numbers}" tabindex="-1">${lang.numbers}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-decrease-nesting-level" data-trix-action="decreaseNestingLevel" title="${lang.outdent}" tabindex="-1">${lang.outdent}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-increase-nesting-level" data-trix-action="increaseNestingLevel" title="${lang.indent}" tabindex="-1">${lang.indent}</button>
         </span>
         <span class="trix-button-group trix-button-group--file-tools" data-trix-button-group="file-tools">
           <button type="button" class="trix-button trix-button--icon trix-button--icon-attach" data-trix-action="attachFiles" title="${lang.attachFiles}" tabindex="-1">${lang.attachFiles}</button>
         </span>
         <span class="trix-button-group-spacer"></span>
         <span class="trix-button-group trix-button-group--history-tools" data-trix-button-group="history-tools">
           <button type="button" class="trix-button trix-button--icon trix-button--icon-undo" data-trix-action="undo" data-trix-key="z" title="${lang.undo}" tabindex="-1">${lang.undo}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-redo" data-trix-action="redo" data-trix-key="shift+z" title="${lang.redo}" tabindex="-1">${lang.redo}</button>
         </span>
       </div>
       <div class="trix-dialogs" data-trix-dialogs>
         <div class="trix-dialog trix-dialog--link" data-trix-dialog="href" data-trix-dialog-attribute="href">
           <div class="trix-dialog__link-fields">
             <input type="url" name="href" class="trix-input trix-input--dialog" placeholder="${lang.urlPlaceholder}" aria-label="${lang.url}" required data-trix-input>
             <div class="trix-button-group">
               <input type="button" class="trix-button trix-button--dialog" value="${lang.link}" data-trix-method="setAttribute">
               <input type="button" class="trix-button trix-button--dialog" value="${lang.unlink}" data-trix-method="removeAttribute">
             </div>
           </div>
         </div>
       </div>
    `; }
    };
    

    但我无法通过importmaps让这个JS工作。我试着切换 var Trix = require("trix") import Trix from "trix"; 以及直接将所有这些内容放入HTML标题中的标记中,看看是否可以让它工作,但运气不好。

    如何使用自定义Rails 7中的Trix工具栏 importmap-rails ? 我是否还需要添加 import "@rails/actiontext" ?

    仅供参考-我正在加载所有其他香草、非刺激性JS config/importmap.rb 然后将其导入 javascript/application.js 有这样的线条 import "custom/trix_extensions.js"

    我的 trix\u扩展。js公司 似乎正在通过我的导入映射正确加载,因为我得到 ReferenceError: Can't find variable: require 在控制台中。所以它告诉我问题是如何将Trix导入到 trix\u扩展。js公司 文件此外,默认的Trix工具栏正在正确加载并按预期工作。我只是没有看到我的定制。

    因此,问题似乎是在使用importmaps导入Trix时如何扩展Trix。

    这是我的全部 配置/导入映射。rb型 文件:

    pin "@rails/activestorage", to: "activestorage.esm.js"
    
    pin "application", preload: true
    
    pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
    pin "@hotwired/stimulus", to: "https://ga.jspm.io/npm:@hotwired/stimulus@3.0.1/dist/stimulus.js"
    pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
    
    pin_all_from "app/javascript/controllers", under: "controllers"
    
    pin "alpinejs", to: "https://unpkg.com/alpinejs@3.8.1/dist/module.esm.js", preload: true
    pin "@rails/ujs", to: "https://ga.jspm.io/npm:@rails/ujs@6.1.5/lib/assets/compiled/rails-ujs.js"
    pin "@rails/request.js", to: "https://ga.jspm.io/npm:@rails/request.js@0.0.6/src/index.js", preload: true
    
    pin "trix", to: "https://ga.jspm.io/npm:trix@2.0.0-alpha.1/dist/trix.js"
    pin "@rails/actiontext", to: "actiontext.js"
    
    pin "sortablejs", to: "https://ga.jspm.io/npm:sortablejs@1.14.0/modular/sortable.esm.js"
    pin "tailwindcss-stimulus-components", to: "https://ga.jspm.io/npm:tailwindcss-stimulus-components@3.0.4/dist/tailwindcss-stimulus-components.modern.js"
    
    pin_all_from "app/javascript/custom", under: "custom"
    

    还有我的 javascript/应用程序。js公司 文件:

    // Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
    import "@hotwired/turbo-rails"
    import "@rails/activestorage"
    import "controllers"
    import "trix"
    import "@rails/actiontext"
    
    import "custom/direct_uploads"
    import "custom/stripe_payments"
    import "custom/table_sort"
    import "custom/trix_extensions"
    
    0 回复  |  直到 3 年前
        1
  •  0
  •   Lee McAlilly    3 年前

    仅供参考-我在我的 javascript/custom/trix_extensions.js 文件:

    //修改自: https://github.com/ParamagicDev/exploring-trix/blob/part01-changing-the-default-toolbar/main.js

    import Trix from 'trix';
    
    window.Trix = Trix; // Don't need to bind to the window, but useful for debugging.
    Trix.config.toolbar.getDefaultHTML = toolbarDefaultHTML;
    
    // trix-before-initialize runs too early.
    // We only need to do this once. Everything after initialize will get the
    // defaultHTML() call automatically.
    document.addEventListener('trix-initialize', updateToolbars, { once: true });
    
    function updateToolbars(event) {
      const toolbars = document.querySelectorAll('trix-toolbar');
      const html = Trix.config.toolbar.getDefaultHTML();
      toolbars.forEach((toolbar) => (toolbar.innerHTML = html));
    }
    
    Trix.config.textAttributes.underline = {
      tagName: 'u'
    }
    const {lang} = Trix.config;
    /**
     * This is the default Trix toolbar. Feel free to change / manipulate it how you would like.
     * see https://github.com/basecamp/trix/blob/main/src/trix/config/toolbar.coffee
     */
    function toolbarDefaultHTML() {
      const {lang} = Trix.config;
      return `
      <div class="trix-button-row">
         <span class="trix-button-group trix-button-group--text-tools" data-trix-button-group="text-tools">
           <button type="button" class="trix-button trix-button--icon trix-button--icon-bold" data-trix-attribute="bold" data-trix-key="b" title="${lang.bold}" tabindex="-1">#{lang.bold}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-italic" data-trix-attribute="italic" data-trix-key="i" title="${lang.italic}" tabindex="-1">${lang.italic}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-strike" data-trix-attribute="strike" title="${lang.strike}" tabindex="-1">${lang.strike}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-underline" data-trix-attribute="underline" data-trix-key="u" title="underline" tabindex="-1">${lang.underline}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-link" data-trix-attribute="href" data-trix-action="link" data-trix-key="k" title="${lang.link}" tabindex="-1">${lang.link}</button>
         </span>
         <span class="trix-button-group trix-button-group--block-tools" data-trix-button-group="block-tools">
           <button type="button" class="trix-button trix-button--icon trix-button--icon-heading-1" data-trix-attribute="heading1" title="${lang.heading1}" tabindex="-1">${lang.heading1}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-quote" data-trix-attribute="quote" title="${lang.quote}" tabindex="-1">${lang.quote}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-bullet-list" data-trix-attribute="bullet" title="${lang.bullets}" tabindex="-1">${lang.bullets}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-number-list" data-trix-attribute="number" title="${lang.numbers}" tabindex="-1">${lang.numbers}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-decrease-nesting-level" data-trix-action="decreaseNestingLevel" title="${lang.outdent}" tabindex="-1">${lang.outdent}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-increase-nesting-level" data-trix-action="increaseNestingLevel" title="${lang.indent}" tabindex="-1">${lang.indent}</button>
         </span>
         <span class="trix-button-group trix-button-group--file-tools" data-trix-button-group="file-tools">
           <button type="button" class="trix-button trix-button--icon trix-button--icon-attach" data-trix-action="attachFiles" title="${lang.attachFiles}" tabindex="-1">${lang.attachFiles}</button>
         </span>
         <span class="trix-button-group-spacer"></span>
         <span class="trix-button-group trix-button-group--history-tools" data-trix-button-group="history-tools">
           <button type="button" class="trix-button trix-button--icon trix-button--icon-undo" data-trix-action="undo" data-trix-key="z" title="${lang.undo}" tabindex="-1">${lang.undo}</button>
           <button type="button" class="trix-button trix-button--icon trix-button--icon-redo" data-trix-action="redo" data-trix-key="shift+z" title="${lang.redo}" tabindex="-1">${lang.redo}</button>
         </span>
       </div>
       <div class="trix-dialogs" data-trix-dialogs>
         <div class="trix-dialog trix-dialog--link" data-trix-dialog="href" data-trix-dialog-attribute="href">
           <div class="trix-dialog__link-fields">
             <input type="url" name="href" class="trix-input trix-input--dialog" placeholder="${lang.urlPlaceholder}" aria-label="${lang.url}" required data-trix-input>
             <div class="trix-button-group">
               <input type="button" class="trix-button trix-button--dialog" value="${lang.link}" data-trix-method="setAttribute">
               <input type="button" class="trix-button trix-button--dialog" value="${lang.unlink}" data-trix-method="removeAttribute">
             </div>
           </div>
         </div>
       </div>
    `;
    }
    

    我想我错过的关键是 document.addEventListener('trix-initialize', updateToolbars, { once: true });

    幸亏 https://github.com/ParamagicDev/ 在此处共享:

    https://github.com/ParamagicDev/exploring-trix/blob/part01-changing-the-default-toolbar/main.js

    推荐文章