Sha256: 5b040d13c554c26a853082b9c69bd5f70687abc20c35abf258807977aa20a8bb

Contents?: true

Size: 1.75 KB

Versions: 15

Compression:

Stored size: 1.75 KB

Contents

import Mention from "@tiptap/extension-mention";

import { createSuggestionRenderer, createNodeView } from "src/decidim/editor/common/suggestion";

const searchUsers = async (queryText) => {
  const query = `{
    users(filter: { wildcard: "${queryText}" }) {
      nickname,
      name,
      avatarUrl,
      __typename,
      ...on UserGroup { membersCount }
    }
  }`;


  return fetch(window.Decidim.config.get("api_path"), {
    method: "POST",
    cache: "no-cache",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ query })
  }).then((response) => {
    if (response.ok) {
      return response.json();
    }
    throw new Error("Could not retrieve data");
  }).then((json) => (json.data.users || []));
};

export default Mention.extend({
  addOptions() {
    const parentOptions = this.parent?.();

    return {
      ...parentOptions,
      renderLabel({ node }) {
        // The labels are formed based on the nicknames returned by the API
        // which already contain the suggestion character, so there is no need
        // to display it twice.
        return `${node.attrs.label ?? node.attrs.id}`
      },
      suggestion: {
        ...parentOptions?.suggestion,
        allowSpaces: true,
        items: async ({ query }) => {
          if (query.length < 2) {
            return [];
          }

          const data = await searchUsers(query);
          const sorted = data.sort((user) => user.nickname.slice(1));
          return sorted.slice(0, 5);
        },
        render: createSuggestionRenderer(this, {
          itemConverter: (user) => {
            return { id: user.nickname, label: `${user.nickname} (${user.name})` }
          }
        })
      }
    };
  },

  addNodeView() {
    return createNodeView(this);
  }
});

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
decidim-core-0.30.0.rc3 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.30.0.rc2 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.30.0.rc1 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.29.2 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.28.5 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.29.1 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.28.4 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.29.0 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.28.3 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.29.0.rc4 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.29.0.rc3 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.29.0.rc2 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.29.0.rc1 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.28.2 app/packs/src/decidim/editor/extensions/mention/index.js
decidim-core-0.28.1 app/packs/src/decidim/editor/extensions/mention/index.js