slack-block-builder
Advanced tools
Comparing version 2.2.0-beta.1 to 2.2.0-beta.2
@@ -1,11 +0,64 @@ | ||
import { PaginatorUIComponent, PaginatorUIComponentParams } from './paginator'; | ||
import { AccordionUIComponent, AccordionUIComponentParams } from './accordion'; | ||
import { PaginatorUIComponent, PaginatorPageCountTextFn, PaginatorActionIdFn, PaginatorBuilderFn } from './paginator-ui-component'; | ||
import { AccordionUIComponent, AccordionTitleTextFn, AccordionActionIdFn, AccordionBuilderFn } from './accordion-ui-component'; | ||
import { PaginatorStateManagerParams, AccordionStateManagerParams } from '../lib'; | ||
export type { PaginatorUIComponent }; | ||
export type { AccordionUIComponent }; | ||
export declare type PaginatorParams<T> = PaginatorStateManagerParams & Omit<PaginatorUIComponentParams<T>, 'paginator'>; | ||
export type { PaginatorUIComponent, AccordionUIComponent }; | ||
interface PaginatorBaseParams<T> { | ||
items: T[]; | ||
nextButtonText?: string; | ||
previousButtonText?: string; | ||
pageCountText?: PaginatorPageCountTextFn; | ||
actionId: PaginatorActionIdFn; | ||
blocksForEach: PaginatorBuilderFn<T>; | ||
} | ||
export declare type PaginatorParams<T> = PaginatorBaseParams<T> & PaginatorStateManagerParams; | ||
/** | ||
* @param {Object} [params] Parameters passed to the constructor. | ||
* @param {string} [params.items] An array of items to be displayed in the paginated content. | ||
* @param {int} [params.page] The number of the page to display. | ||
* @param {int} [params.perPage] The number of items to display on a page. | ||
* @param {int} [params.totalItems] The total number of items in the data set across all pages. | ||
* @param {PaginatorActionIdFn} [params.actionId] A function that receives pagination data and returns a string to set as the action IDs of the navigation buttons. | ||
* @param {PaginatorBuilderFn} [params.blocksForEach] A function that receives an object with a single item and returns the blocks to create for that item. | ||
* @param {string} [params.nextButtonText] The text to display on the button that moves forward in the pagination. | ||
* @param {string} [params.previousButtonText] The text to display on the button that moves backward in the pagination. | ||
* @param {PaginatorPageCountTextFn} [params.pageCountText] A function to create a custom page count in the UI. | ||
* | ||
* {@link https://www.blockbuilder.dev/#/components/paginator|View in Block Builder Documentation} | ||
*/ | ||
export declare function Paginator<T>(params: PaginatorParams<T>): PaginatorUIComponent<T>; | ||
export declare type EasyPaginatorParams<T> = Omit<PaginatorParams<T>, 'totalItems'>; | ||
/** | ||
* @param {Object} [params] Parameters passed to the constructor. | ||
* @param {string} [params.items] An array of items to be displayed in the paginated content. | ||
* @param {int} [params.page] The number of the page to display. | ||
* @param {int} [params.perPage] The number of items to display on a page. | ||
* @param {PaginatorActionIdFn} [params.actionId] A function that receives pagination data and returns a string to set as the action IDs of the navigation buttons. | ||
* @param {PaginatorBuilderFn} [params.blocksForEach] A function that receives an object with a single item and returns the blocks to create for that item. | ||
* @param {string} [params.nextButtonText] The text to display on the button that moves forward in the pagination. | ||
* @param {string} [params.previousButtonText] The text to display on the button that moves backward in the pagination. | ||
* @param {PaginatorPageCountTextFn} [params.pageCountText] A function to create a custom page count in the UI. | ||
* | ||
* {@link https://www.blockbuilder.dev/#/components/easy-paginator|View in Block Builder Documentation} | ||
*/ | ||
export declare function EasyPaginator<T>(params: EasyPaginatorParams<T>): PaginatorUIComponent<T>; | ||
export declare type AccordionParams<T> = Omit<AccordionUIComponentParams<T>, 'stateManager'> & AccordionStateManagerParams; | ||
interface AccordionBaseParams<T> { | ||
items: T[]; | ||
expandButtonText?: string; | ||
collapseButtonText?: string; | ||
titleText: AccordionTitleTextFn<T>; | ||
actionId: AccordionActionIdFn; | ||
blocksForExpanded: AccordionBuilderFn<T>; | ||
} | ||
export declare type AccordionParams<T> = AccordionBaseParams<T> & AccordionStateManagerParams; | ||
/** | ||
* @param {Object} [params] Parameters passed to the constructor. | ||
* @param {string} [params.items] An array of items to be displayed in the expandable/collapsable content. | ||
* @param {AccordionTitleTextFn} [params.titleText] A function that receives an object with a single item and returns a string to be displayed next to the expand/collapse button. | ||
* @param {AccordionActionIdFn} [params.actionId] A function that receives the accordion state data and returns a string to set as the action IDs of the expand/collapse buttons. | ||
* @param {AccordionBuilderFn} [params.blocksForExpanded] A function that receives an object with a single item and returns the blocks to create for that item. | ||
* @param {string} [params.expandButtonText] The text to display on the button that expands an item in the UI. | ||
* @param {string} [params.collapseButtonText] The text to display on the button that collapses an item in the UI. | ||
* | ||
* {@link https://www.blockbuilder.dev/#/components/accordion|View in Block Builder Documentation} | ||
*/ | ||
export declare function Accordion<T>(params: AccordionParams<T>): AccordionUIComponent<T>; | ||
@@ -12,0 +65,0 @@ declare const components: { |
"use strict"; | ||
/* eslint-disable max-len */ | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.Components = exports.Accordion = exports.EasyPaginator = exports.Paginator = void 0; | ||
const paginator_1 = require("./paginator"); | ||
const accordion_1 = require("./accordion"); | ||
const paginator_ui_component_1 = require("./paginator-ui-component"); | ||
const accordion_ui_component_1 = require("./accordion-ui-component"); | ||
const lib_1 = require("../lib"); | ||
/** | ||
* @param {Object} [params] Parameters passed to the constructor. | ||
* @param {string} [params.items] An array of items to be displayed in the paginated content. | ||
* @param {int} [params.page] The number of the page to display. | ||
* @param {int} [params.perPage] The number of items to display on a page. | ||
* @param {int} [params.totalItems] The total number of items in the data set across all pages. | ||
* @param {PaginatorActionIdFn} [params.actionId] A function that receives pagination data and returns a string to set as the action IDs of the navigation buttons. | ||
* @param {PaginatorBuilderFn} [params.blocksForEach] A function that receives an object with a single item and returns the blocks to create for that item. | ||
* @param {string} [params.nextButtonText] The text to display on the button that moves forward in the pagination. | ||
* @param {string} [params.previousButtonText] The text to display on the button that moves backward in the pagination. | ||
* @param {PaginatorPageCountTextFn} [params.pageCountText] A function to create a custom page count in the UI. | ||
* | ||
* {@link https://www.blockbuilder.dev/#/components/paginator|View in Block Builder Documentation} | ||
*/ | ||
function Paginator(params) { | ||
const { page, perPage, totalItems } = params; | ||
const paginationCalculator = new lib_1.PaginatorStateManager({ page, perPage, totalItems }); | ||
return new paginator_1.PaginatorUIComponent({ | ||
paginator: paginationCalculator, | ||
const stateManager = new lib_1.PaginatorStateManager({ page, perPage, totalItems }); | ||
return new paginator_ui_component_1.PaginatorUIComponent({ | ||
items: params.items, | ||
paginator: stateManager, | ||
nextButtonText: params.nextButtonText || null, | ||
previousButtonText: params.previousButtonText || null, | ||
pageCountText: params.pageCountText || null, | ||
actionId: params.actionId, | ||
pageCountTextFunction: params.pageCountText || null, | ||
actionIdFunction: params.actionId, | ||
builderFunction: params.blocksForEach, | ||
}); | ||
} | ||
exports.Paginator = Paginator; | ||
/** | ||
* @param {Object} [params] Parameters passed to the constructor. | ||
* @param {string} [params.items] An array of items to be displayed in the paginated content. | ||
* @param {int} [params.page] The number of the page to display. | ||
* @param {int} [params.perPage] The number of items to display on a page. | ||
* @param {PaginatorActionIdFn} [params.actionId] A function that receives pagination data and returns a string to set as the action IDs of the navigation buttons. | ||
* @param {PaginatorBuilderFn} [params.blocksForEach] A function that receives an object with a single item and returns the blocks to create for that item. | ||
* @param {string} [params.nextButtonText] The text to display on the button that moves forward in the pagination. | ||
* @param {string} [params.previousButtonText] The text to display on the button that moves backward in the pagination. | ||
* @param {PaginatorPageCountTextFn} [params.pageCountText] A function to create a custom page count in the UI. | ||
* | ||
* {@link https://www.blockbuilder.dev/#/components/easy-paginator|View in Block Builder Documentation} | ||
*/ | ||
function EasyPaginator(params) { | ||
@@ -25,3 +54,3 @@ const { page, perPage, items } = params; | ||
const extractedItems = paginationCalculator.extractItems(items); | ||
return new paginator_1.PaginatorUIComponent({ | ||
return new paginator_ui_component_1.PaginatorUIComponent({ | ||
paginator: paginationCalculator, | ||
@@ -31,17 +60,30 @@ items: extractedItems, | ||
previousButtonText: params.previousButtonText || null, | ||
pageCountText: params.pageCountText || null, | ||
actionId: params.actionId, | ||
pageCountTextFunction: params.pageCountText || null, | ||
actionIdFunction: params.actionId, | ||
builderFunction: params.blocksForEach, | ||
}); | ||
} | ||
exports.EasyPaginator = EasyPaginator; | ||
/** | ||
* @param {Object} [params] Parameters passed to the constructor. | ||
* @param {string} [params.items] An array of items to be displayed in the expandable/collapsable content. | ||
* @param {AccordionTitleTextFn} [params.titleText] A function that receives an object with a single item and returns a string to be displayed next to the expand/collapse button. | ||
* @param {AccordionActionIdFn} [params.actionId] A function that receives the accordion state data and returns a string to set as the action IDs of the expand/collapse buttons. | ||
* @param {AccordionBuilderFn} [params.blocksForExpanded] A function that receives an object with a single item and returns the blocks to create for that item. | ||
* @param {string} [params.expandButtonText] The text to display on the button that expands an item in the UI. | ||
* @param {string} [params.collapseButtonText] The text to display on the button that collapses an item in the UI. | ||
* | ||
* {@link https://www.blockbuilder.dev/#/components/accordion|View in Block Builder Documentation} | ||
*/ | ||
function Accordion(params) { | ||
const { items, expandedItems, collapseOnExpand } = params; | ||
const stateManager = new lib_1.AccordionStateManager({ expandedItems, collapseOnExpand }); | ||
return new accordion_1.AccordionUIComponent({ | ||
return new accordion_ui_component_1.AccordionUIComponent({ | ||
items, | ||
stateManager, | ||
paginator: stateManager, | ||
expandButtonText: params.expandButtonText || null, | ||
collapseButtonText: params.collapseButtonText || null, | ||
titleText: params.titleText, | ||
actionId: params.actionId, | ||
titleTextFunction: params.titleText, | ||
actionIdFunction: params.actionId, | ||
builderFunction: params.blocksForExpanded, | ||
}); | ||
@@ -48,0 +90,0 @@ } |
@@ -25,4 +25,3 @@ export interface PaginatorStateManagerParams { | ||
getPreviousPageState(): PaginatorState; | ||
checkStateIsMoveForward(state: PaginatorState): boolean; | ||
extractItems<T>(items: T[]): T[]; | ||
} |
@@ -58,5 +58,2 @@ "use strict"; | ||
} | ||
checkStateIsMoveForward(state) { | ||
return this.offset < state.offset; | ||
} | ||
extractItems(items) { | ||
@@ -63,0 +60,0 @@ const beginning = this.offset; |
{ | ||
"name": "slack-block-builder", | ||
"version": "2.2.0-beta.1", | ||
"version": "2.2.0-beta.2", | ||
"description": "Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.", | ||
@@ -54,3 +54,3 @@ "author": { | ||
"docs:generate": "node docs-generator-dist/index.js", | ||
"docs:local": "docsify serve docs-generator --port 3000", | ||
"docs:local": "docsify serve docs --port 3000", | ||
"tests:lint": "eslint 'tests/**/*.ts' --fix", | ||
@@ -57,0 +57,0 @@ "tests:coverage": "codecov", |
120
README.md
@@ -24,3 +24,3 @@ <p align="center"> | ||
![An example of using Block Builder](docs/resources/images/hero-image.png) | ||
![An example of using Block Builder](docs/resources/images/block-builder-hero-image.png) | ||
@@ -33,4 +33,2 @@ *** | ||
> :tada: **Block Builder Version 2.0 is here! Learn about the new features and how to install it [here](docs/announcements/version-2.md).** | ||
**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture. | ||
@@ -41,2 +39,3 @@ | ||
* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax. | ||
* Commonly-used UI components, such as a `Paginator` and `Accordion`. | ||
* The ability to build more complex flows using loops and conditionals. | ||
@@ -51,11 +50,6 @@ * A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping. | ||
### :rocket: Coming Soon | ||
* `Paginator` component. | ||
* `Accordion` component. | ||
### :gift: Benefits | ||
* Write three times less code. | ||
* Build more sophistocated, elegant flows. | ||
* Build more sophisticated, elegant flows. | ||
* Design better UI architecture for your Slack apps. | ||
@@ -65,8 +59,7 @@ * Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/). | ||
### :phone: Let's Talk? | ||
### :busts_in_silhouette: Join The Community | ||
Feedback – love it! Aside from GitHub Issues, there are Slack channels available in popular bot communities to discuss **Block Builder** – we'll see you there! :raised_hands: | ||
Feedback – love it! Aside from GitHub Issues, there's a Slack channel available in the Slack Community workspace to discuss **Block Builder** – we'll see you there! :raised_hands: | ||
* **Slack Community** – [\#block-builder](https://slackcommunity.com) | ||
* **Bot Developer Hangout** – [\#block-builder](https://community.botkit.ai) | ||
@@ -120,3 +113,3 @@ ### :floppy_disk: Installation | ||
### Group Explanations | ||
### Object Breakdown | ||
@@ -177,4 +170,4 @@ `Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. | ||
const myMessage = ({ channel, dangerLevel }) => { | ||
return Message() | ||
export default ({ channel, dangerLevel }) => | ||
Message() | ||
.channel(channel) | ||
@@ -200,3 +193,2 @@ .text('Alas, my friend.') | ||
.buildToJSON(); | ||
}; | ||
``` | ||
@@ -209,4 +201,4 @@ | ||
const myShorterMessage = ({ channel, dangerLevel }) => { | ||
return Message({ channel, text: 'Alas, my friend.' }) | ||
export default ({ channel, dangerLevel }) => | ||
Message({ channel, text: 'Alas, my friend.' }) | ||
.blocks( | ||
@@ -224,3 +216,2 @@ Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }), | ||
.buildToJSON(); | ||
}; | ||
``` | ||
@@ -243,4 +234,4 @@ | ||
const myShorterModal = ({ menuOptions, selected }) => { | ||
return Modal({ title: 'PizzaMate', submit: 'Get Fed' }) | ||
export default ({ menuOptions, selected }) => | ||
Modal({ title: 'PizzaMate', submit: 'Get Fed' }) | ||
.blocks( | ||
@@ -265,3 +256,2 @@ Blocks.Section({ text: 'Hey there, colleague!' }), | ||
.buildToJSON(); | ||
}; | ||
``` | ||
@@ -275,2 +265,86 @@ | ||
### Paginator Component | ||
**Block Builder** provides a `Paginator` component that assists in producing paginated UI. It allows you to dictate the UI to build for each items passed in and provides to the `actionId` all of the data (`page`, `perPage`, `totalPages`, `offset`, `totalItems` ) you need to produce the right page when a user clicks the Next or Previous buttons. | ||
It supports optional customizations, such as: | ||
`nextButtonText` – Used to pass in custom text for the Next button, but has a default. | ||
`previousButtonText` – Used to pass in custom text for the Next button, but has a default. | ||
`pageCountText` – Used to pass in custom text for the page count, accepts a function and passes the function an object with `page` and `totalPages` properties. | ||
```javascript | ||
import { Modal, Blocks, Elements, Paginator } from 'slack-block-builder'; | ||
export default ({ tasks, totalTasks, page, perPage }) => Modal({ title: 'Open Tasks' }) | ||
.blocks( | ||
Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\'t find what you need, feel free to open an issue on GitHub.' }), | ||
Blocks.Section({ text: `You currently have *${totalTasks} open task(s)*:` }), | ||
Paginator({ | ||
perPage, | ||
items: tasks, | ||
totalItems: totalTasks, | ||
page: page || 1, | ||
actionId: ({ page, offset }) => JSON.stringify({ action: 'render-tasks', page, offset }), | ||
blocksForEach: ({ item }) => [ | ||
Blocks.Divider(), | ||
Blocks.Section({ text: `*${item.title}*` }) | ||
.accessory( | ||
Elements.Button({ text: 'View Details' }) | ||
.actionId('view-details') | ||
.value(item.id.toString())), | ||
Blocks.Section({ text: `*Due Date:* ${getDate(item.dueDate)}` }), | ||
], | ||
}).getBlocks()) | ||
.close('Done') | ||
.buildToJSON(); | ||
``` | ||
The code above renders the modal below. And be sure to check out the full documentation on the **Block Builder** doc site for more information. | ||
![An example of using Block Builder for Modals](docs/resources/images/paginator-modal-example.png) | ||
[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Open%20Tasks%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hello!%20:wave::skin-tone-4:%20%20Below%20you%20can%20find%20all%20of%20your%20open%20tasks.%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22You%20currently%20have%20*58%20open%20task(s)*:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Set%20Up%20Webhook%20Monitoring*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%225%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1633392000%5E%7Bdate%7D%7C2021-10-05%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Refactor%20Payment%20Service*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%223%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635292800%5E%7Bdate%7D%7C2021-10-27%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Finalize%20JumboCode%20Documentation*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%224%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635465600%5E%7Bdate%7D%7C2021-10-29%3E%22%7D,%22type%22:%22section%22%7D,%7B%22elements%22:%5B%7B%22type%22:%22mrkdwn%22,%22text%22:%22Page%208%20of%2020%22%7D%5D,%22type%22:%22context%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22elements%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Previous%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:7,%5C%22offset%5C%22:18%7D%22,%22type%22:%22button%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Next%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:9,%5C%22offset%5C%22:24%7D%22,%22type%22:%22button%22%7D%5D,%22type%22:%22actions%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D) | ||
### Accordion Component | ||
Using the `Accordion` component, you can easily create a customizable accordion for your Slack app. It not only assists in building a suitable UI, but also calculates the next state and gives you access to it in the `actionId` of the buttons in the accordion, so that you can pass that back to your app's backend and use it to render the next state. | ||
It supports optional customizations, such as: | ||
`collapseOnExpand` – Dictates whether or not multiple items can be expanded at once. When set to true, only one item will be expanded at any given time. | ||
`expandButtonText` – Used to pass in custom text for the button that expands an item, but has a default. | ||
`collapseButtonText` – Used to pass in custom text for the button that collapses an expanded item, but has a default. | ||
```javascript | ||
import { Modal, Blocks, Accordion } from 'slack-block-builder'; | ||
export default ({ faqs, expandedItems }) => Modal({ title: 'FAQ' }) | ||
.blocks( | ||
Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\'t find what you need, feel free to open an issue on GitHub.'}), | ||
Blocks.Divider(), | ||
Accordion({ | ||
items: faqs, | ||
expandedItems: expandedItems || [], // In this case, the value is [1] | ||
collapseOnExpand: true, | ||
titleText: ({ item }) => `*${item.question}*`, | ||
actionId: ({ expandedItems }) => JSON.stringify({ action: 'render-faqs', expandedItems }), | ||
blocksForExpanded: ({ item }) => [ | ||
Blocks.Section({ text: `${item.answer}` }), | ||
], | ||
}).getBlocks()) | ||
.close('Done') | ||
.buildToJSON(); | ||
``` | ||
The code above renders the modal below. And be sure to check out the full documentation on the **Block Builder** doc site for more information. | ||
![An example of using Block Builder for Modals](docs/resources/images/accordion-modal-example.png) | ||
[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22FAQ%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hi!%20:wave::skin-tone-4:%20And%20welcome%20to%20the%20FAQ%20section!%20Take%20a%20look%20around%20and%20if%20you%20don't%20find%20what%20you%20need,%20feel%20free%20to%20open%20an%20issue%20on%20GitHub.%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Why%20should%20I%20adopt%20Block%20Builder?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B0%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*How%20do%20I%20use%20the%20%60Accordion%60%20component?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Close%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22It's%20actually%20_really_%20easy!%20All%20you%20have%20to%20do%20is%20pass%20in%20the%20items%20you%20want%20to%20show%20up%20in%20the%20UI,%20a%20function%20that%20captures%20the%20expanded%20items%20in%20the%20%60actionId%60,%20and%20a%20function%20that%20builds%20out%20the%20right%20UI%20when%20an%20item%20is%20expanded.%5Cn%5CnThat's%20it,%20so%20go%20give%20it%20a%20try!%20%20:raised_hands::skin-tone-4:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20other%20features%20are%20in%20the%20pipeline?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B2%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Do%20you%20work%20for%20Slack?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B3%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20can%20I%20do%20to%20help?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B4%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D) | ||
### Utility Functions | ||
@@ -328,3 +402,3 @@ | ||
const myMdMessage = ({ channel, user }) => { | ||
export default ({ channel, user }) => { | ||
const slashCommands = ['/schedule', '/cancel', '/remind', '/help']; | ||
@@ -331,0 +405,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
294783
6181
424