sky-list

Vue component for creating search

Usage no npm install needed!

<script type="module">
  import skyList from 'https://cdn.skypack.dev/sky-list';
</script>

README

sky-list

Vue module for requesting search API (via axios) and displaying result with different pagination options

List of content

Installation

npm install sky-list
yarn add sky-list

Usage

Import

import Vue from 'vue';

Different import approaches. The First provides the minified and compiled dist version, the other the raw .vue file.

import SkyList from 'sky-list';

// If you want to use the baseline scss add the following line
import '${YOUR-PROJECT-ROOT-PATH}/node_modules/sky-list/src/SkyList.scss';

Install plugin

Vue.use(SkyList);

Option tables

Props

Name Type Default Options Description
parameters Object { keywords: '' } Parameters to use in query declared with initial value
options Object {
api: '/umbraco/api/site/search/',
limit: 10,
showCount: false,
paginationType: 'more',
loadFetch: false,
}
paginationType
navigation
numeric
pagination
more
all
Change custom request setup.
loadFetch: enables/disables fetch on page load.
showCount: enables/disables "x" results found.
api: your prefered endpoint
filter Object {} Declare query properties to be handled as filters eg:
{ fitlerName: initialValue }
value-map Object {} If a v-model returns a object and a prop is needed, it can be declared with initial value eg:
{ nestedPropName: initialValue }
validate-query Function query => query.keywords
live-search Boolean true Enable/disable search on query change
query Object {} Pass a query object directly to SkyList. Overrides internal query object. Useful for keeping query state outside of SkyList and only using it to fetch and render results
transform-params Function params => params Hook to modify params before request is sent. Useful for transforming SkyList to integrate with endpoints that do not use the default param naming conventions
transform-result Function result => result Hook to modify result before request is resolved. Useful for transforming the returned data to match the API response structure SkyList expects.

Slots

| Name | Slot-scope | Description | |--|--|--| | listForm | query Object
result Object | Slot for custom form setup to be v-model'ed against SkyList query | | listItem | index Number
listItem Object | Slot for custom item markup | | listAside | query Object
result Object | Slot for adding custom aside content next to the result list | | resultMessage | query Object
pagination Object | Slot for custom message when results are found | | noResultMessage | query Object | Slot for custom message when no results are found | | listMore | itemsLeft Number | Slot for custom show more button | | listPrev | | Slot for custom previous button | | listNext | | Slot for custom next button | | paginationBullet | count Number | Slot for custom pagination bullets | | filters | query Object
result Object
area Object | Slot for filtering result (i.e. by groups/areas etc.) |

Events

SkyList emits a few events for flexibility. This list will likely expand in the future. Example:

<sky-list @result="handleResultFn" />

| Name | Arguments | Description | |--|--|--| | result | result Object | Emitted every time result changes | | loadingBegin | none | Emitted whenever a fetch begins | | loadingEnd | none | Emitted when done fetching |

Examples

<sky-list>
    <div
        slot="listForm"
        slot-scope="{ query, result }"
    >
        <input type="text" v-model="query['keywords']" placeholder="Type your search query">
    </div>


    <div
        slot="listItem"
        slot-scope="{ index, item }"
        :item="item"
    >
        Custom handling of list item
    </div>
</sky-list>

Component options (with default values)

<sky-list
    :parameters="{ keywords: '' }" || Add your own key/value pair with initial values
    :options="{
        api: '/umbraco/api/site/search/',
        limit: 10,
        showCount: false, || true |false
        paginationType: 'more', || 'navigation' | 'pagination' | 'more' | 'all' | 'numeric'
        loadFetch: false,
    }"
    :validate-query="query => query.keywords" || parse in your own query validation
    :live-search="true" || true/false
    :value-map="{}" || If v-model returns an object setup rule for which prop to use eg. { nestedPropName: initialValue }
>
    <!-- content config here -->
    <!-- pagination config here -->
</sky-list>

Content slots (with default values)

Sky-list exposes different slot which can be customized

Message slots

resultMessage: custom message displayed when results are found

<sky-list ... >
    <span
        slot="resultMessage"
        slot-scope="{ query, pagination }"
    >
        Your search for <em>"{{query.keywords}}"</em> returned <em>{{pagination.total}} {{(pagination.total === 1) ? 'result' : 'results'}}</em>
    </span>
</sky-list>

noResultMessage: custom message displayed when no results are found

<sky-list ... >
    <span
        slot="noResultMessage"
        slot-scope="{ query }"
        v-text="'Your search for ${query.keywords} returned no results'"
    />
</sky-list>

List item slot

listItem: Slot for customizing list items. exposes item object and list index

<sky-list ...>
    <div
        slot="listItem"
        slot-scope="{ item, index }"
    >
        <small v-text="`No. ${index + 1}`"
        <h2 v-text="item.title" />
        <p v-text="item.teaser" />
    </div>
</sky-list>

Preferably this can be used with custom components like this

<sky-list ...>
    <MyComponent
        slot="listItem"
        slot-scope="{ item, index }"
        :my-prop-for-data="item"
        :my-prop-for-index="index"
    />
</sky-list>

Pagination slot options (with default values)

paginationType: 'more' | 'all'

Slot for customizing show more / all button

<sky-list ... >
    <span
        slot="listMore"
        slot-scope="{ itemsLeft }"
        v-text="`${itemsLeft} not displayed`"
    />
</sky-list>
paginationType: 'navigation' | 'pagination'

listPrev: Slot for customizing previous button nextPrev: Slot for customizing next button

<sky-list ... >
    <span slot="listPrev">Previous</span>
    <span slot="listNext">Next</span>
</sky-list>
paginationType: 'numeric' | 'pagination'

paginationBullet: Slot for customizing bullets

<sky-list ... >
    <span
        slot="paginationBullet"
        slot-scope=" { count }"
        v-text="`Page ${count}`"
    />
</sky-list>

API Response Setup

SkyList expects a response with the following setup

{
    "meta":{
        "code":200
    },
    "pagination":{
        "total":1,
        "limit":10,
        "offset":0
    },
    "data":[
        {
            title: 'item1',
            teaser: 'lorem ipsum',
        },
        {
            title: 'item2',
            teaser: '',
        },
        {
            title: 'item3',
            teaser: null,
        },
        ...
    ]
}

If your endpoint expects other names for pagination params than limit and offset the transform-params prop can be used to alter the params before requesting. Likewise, upon receiving data, you can use the transform-result prop to transform any data received to match the type of API response SkyList expects. Quick example of both in use:

<SkyList
    :options="{
        api: foreignEndpoint,
    }"
    :transform-params="params => ({
        q: params.keywords,
        startIndex: params.offset,
        maxResults: params.limit,
    })"
    :transform-result="result => ({
        pagination: {
            total: result.TotalResults,
            limit: result.EffectiveParameters.MaxResults,
            offset: result.Offset,
        },
        data: result.Documents,
    })"
>
    ...
</SkyList>

Credits

This module is made by the Frontenders at skybrud.dk. Feel free to use it in any way you want. Feedback, questions and bugreports should be posted as issues. Pull-requests appreciated!