npm install --save @ezraobiwale/vue-doo
import Vue from 'vue';
import VueDoo from '@ezraobiwale/voo-doo';
Vue.use(VueDoo, {
// hellojs (social login) config object
// @see https://adodson.com/hello.js/#helloinit
hello: {
// credentials object
credentials: {
facebook: id,
windows: id,
google: id,
// ...
},
// options object
options: {
}
},
// trigger ajax.started and ajax.ended events
http: {
// trigger ajax.started and ajax.ended events
ajaxEvents: true,
// axios configuration object
// @see https://github.com/axios/axios#axioscreateconfig
axios: {
baseUrl: 'https://api.example.com',
headers: {
Accept: 'application/json',
Authorization: 'Bearer some-authentication-token'
}
},
// function to call for all request errors
catchAll(error_response) {
// do something with error_response object
console.error('Request error:', error_response);
}
},
// vuex-persistedstate configuration object
// @see https://github.com/robinvdvleuten/vuex-persistedstate#createpersistedstateoptions
store: {
name: 'some-store-name'
},
// vue-toasted configuration object
// @see https://github.com/shakee93/vue-toasted#api
toasts: {
iconPack: 'fontawesome'
}
});
Using environment variables may be sometimes necessary even for frontend.
On install, an env.js
file is created in the root directory and the
config/prod.env.js
file is changed to ensure the variables are processed.
VueDoo
is a combination of super-powerful packages needed for every Vue frontend
app. These packages include:
- axios
- hello.js
- sweetalert
- vue-social-sharing
- vue-toasted
- vuex
- vuex-persistedstate
Shows a loading icon.
Props:
Name | Type | Required | Default | Description |
---|---|---|---|---|
color | string |
no | #333 | The color of the icon |
height | string |
no | - | The height of the icon |
icon | integer |
no | 1 | The type of icon. 1 - 8 |
width | string |
no | - | The width of the icon |
A replacement for router-link
which allows a function to be called on each link
before being used.
Props:
Name | Type | Required | Default | Description |
---|---|---|---|---|
to | string |
yes | - | The path to navigate to |
Fetches the resource at an endpoint and provides a button for fetching subsequent pages from the same endpoint when paginated.
Props:
Name | Type | Required | Default | Description |
---|---|---|---|---|
buttonClass | string |
no | - | The class of the load more button |
buttonText | string |
no | Load More | The text of the load more button |
hasNext | function |
no | function |
The function to call to check if the endpoint has a subsequent page |
loadingColor | string |
no | - | The color of the loading icon displayed when loading the next page |
loadingIcon | integer |
no | 1 | The icon to show |
pageKey | string |
no | page | The key on the GET request which holds the desired page |
path | string |
yes | - | The path to the initial load |
Slots:
Name | Scope | Description |
---|---|---|
default | boolean canLoadMore, boolean isLoading | Overwrites the button and loading icon implementation |
Events
- requestOK ( requestResponse, pageNumber ): Emitted when the request is successful.
- requestError ( requestResponse ): Emitted when the request fails.
Two properties are added to all Vue
instances, thereby making them available
in all components on the context this
.
A global event bus.
The hellojs object.
A wrapper around axios. It operates exactly like axios and has all the instance methods.
All instance methods of $http
return a Promise. Both the resolve and the
reject callback functions have the same parameters:
this.$http.get('/path/to/resource')
.then((data, status, headers, originalAxiosResponseObject) => {})
.catch((data, status, headers, originalAxiosResponseObject) => {});
Note: data
is the actual response received from the server.
The vue-toasted object.
Some utility functions are also provided and are available on the this
context:
Safely deletes a deep key on an object (including arrays).
let obj = {
first_name: 'John',
last_name: 'Doe',
books: [
{
id: 1,
title: 'The Tale of the Lost Man',
year: 2008
},
{
id: 2,
title: 'Another Year Gone',
year: 2009
}
],
contacts: {
phone: '012345678',
email: '[email protected]',
facebook: 'johndoe',
twitter: '@johndoe'
}
};
// array
this.deepDelete('books.0.year', obj);
this.deepDelete('books.1', obj);
// object
this.deepDelete('contacts.phone', obj);
Safely retrieves the value of a deep property on the baseObject
. If the value
is undefined
, the defaultValue
is returned.
Using the obj
example above,
this.deepValue('books.1.year', obj); // 20009
this.deepValue('books.2.year', obj); // undefined
this.deepValue('books.2.year', obj, 'Not available'); // Not availalbe
this.deepValue('contacts.twitter', obj); // @johndoe
this.deepValue('contacts.linkedin', obj, 'N/A'); // N/A
Get an environment variable
this.env('NODE_ENV'); // development
this.env('node_env'); // development
this.env('not_defined_variable', 'Not set'); // Not set
A unified function to search an object (including arrays) and retrieve the
first match. If no match is found, the defaultValue
is returned.
var objects = {
first: {
id: 1,
time: 10,
},
second: {
id: 2,
time: 3
}
};
this.findIn(objects, item => item.time === 3); // {id: 2, time: 3}
this.findIn(objects, item => item.time === 6, {}); // {}
// The same thing applies for arrays
Removes the given key and its value from the given object. If the object is reactive,
the object is notified of the pull. Parameter key
may be dot-denoted.
Searches for the value in the object and removes it and its key from the given object. If the object is reactive, the object is notified of the pull.
Pushes a value to the given object (or array). If an object, the key parameter MUST be provided.
Parameter key
may be dot-denoted. However, is parameter ignoreDots
is true
,
then the whole key, w/ the dots, is used as a whole key.
this.push([], this.data, 'contacts.lists'); // { contacts: { lists: [] } }
this.push([], this.data, 'contacts.lists', true); // { "contacts.lists" : [] }
VueJS' v-for
can be used for number ranges however, they are not zero-indexed.
This is an implementation that is zero-indexed.
<!-- Creates 11 divs with contents 0 to 10 -->
<div v-for="num in range(10)">{{ num }}</div>
<!-- Creates 10 divs with contents 1 to 10 -->
<div v-for="num in range(1, 10)">{{ num }}</div>
<!-- Creates 10 divs with contents 5 to 50 in steps of 5 -->
<div v-for="num in range(5, 50, 5)">{{ num }}</div>
<!-- Creates 10 divs with contents 10 to 1 -->
<div v-for="num in range(10, 1)">{{ num }}</div>
<!-- Creates 6 divs with contents 10 to 0, in steps of -2 -->
<div v-for="num in range(10, 0, 2)">{{ num }}</div>
Adds a value to an object at the given key while ensuring reactivity.
Interacts with the Vuex
store object.
let store = this.store(); // Fetches the store object
store.set('env', 'testing'); // Store object
store.get('env'); // testing
store.remove('env'); // testing
store.get('env'); // undefined
// shortcuts
this.store('env', 'testing'); // Store object
this.store('env'); // testing
A shortcut to this.$toasted.show(message, options)
.