Go to file
Sergii Leonenko 6df2d69eb8 TT#96352 - CSC: As a Customer, I want change my Mail2Fax settings 4 years ago
bin TT#97200 CSC: Fix issues in "yarn run" scripts for Win platform 5 years ago
debian TT#101060 Build-Depend on either yarnpkg or yarn + use according binary 5 years ago
doc TT#96253 Upgrade to Quasar 1.14.1 5 years ago
env TT#97850 CSC: Fix dev env script 5 years ago
public TT#88909 Migrate Quasar to version 1.14.0 5 years ago
src TT#96352 - CSC: As a Customer, I want change my Mail2Fax settings 4 years ago
t TT#103201 Close call forwarding condition popups if opening other popups or menus 5 years ago
templates TT#103201 Close call forwarding condition popups if opening other popups or menus 5 years ago
test TT#103201 Close call forwarding condition popups if opening other popups or menus 5 years ago
.babelrc TT#88909 Migrate Quasar to version 1.14.0 5 years ago
.editorconfig TT#88909 Migrate Quasar to version 1.14.0 5 years ago
.eslintignore TT#88909 Migrate Quasar to version 1.14.0 5 years ago
.eslintrc.js TT#88909 Migrate Quasar to version 1.14.0 5 years ago
.gitignore TT#96811 CSC: Refactor PBXDevice filtering 5 years ago
.gitreview
.mailmap TT#91650 Add a .mailmap file to correct author information 5 years ago
.postcssrc.js TT#88909 Migrate Quasar to version 1.14.0 5 years ago
.stylintrc
.yarnrc TT#96365 Fix registry in yarn.lock 5 years ago
CONTRIBUTING.md TT#71950 Fix typos 5 years ago
README.md TT#96150 Improve developer guide 5 years ago
TESTDATA.md
babel.config.js TT#103201 Close call forwarding condition popups if opening other popups or menus 5 years ago
dev-config.sh
dev.sh
jest.config.js TT#88909 Migrate Quasar to version 1.14.0 5 years ago
jsconfig.json TT#88909 Migrate Quasar to version 1.14.0 5 years ago
package.json TT#102400 Rework current state of CallForwarding 5 years ago
quasar.conf.js TT#99753 Add identifiers to Vue.js components to improve selection in E2E tests 4 years ago
quasar.extensions.json TT#88909 Migrate Quasar to version 1.14.0 5 years ago
quasar.testing.json TT#88909 Migrate Quasar to version 1.14.0 5 years ago
tox.ini TT#79804 allow longer lines for pep8 check 5 years ago
yarn.lock TT#102400 Rework current state of CallForwarding 5 years ago

README.md

Customer Self-Care Web UI

Development Quick Start for internal developers

Run development environment in Docker

This is the preferred way to work with. If you have any problems with Docker, you can fallback to the method described in the next chapter.

yarn run dev:docker dev-web-trunk.mgm.sipwise.com

Run development environment in your system of choice

yarn run config dev-web-trunk.mgm.sipwise.com
yarn run dev

Technology

Vue.js and Quasar

After a test phase with Sencha Ext JS we decided to use Vue.js in combination with the Quasar Framework.

Developers basics

We highly recommend the following courses to understand the principles and ultimately the code:

In addition, we also recommend the following Quasar Framework tutorials:

Project Guide

Add a new page

In order to add a new page you need to go along the following steps:

  • Create a new page component using the following naming pattern

    src/pages/CscPageNewFeature.vue

  • Create a route and add it to the route file

    src/router/routes.js

{
    path: '/user/new-feature',
    component: CscPageNewFeature,
    meta: {
        title: i18n.t('pages.newFeature.title'),
        subtitle: i18n.t('navigation.newFeature.subTitle')
    }
}
  • Add new feature to the main menu

    src/components/CscMainMenuTop.vue

{
    to: '/user/new-feature',
    icon: 'fancy_icon',
    label: this.$t('navigation.newFeature.title'),
    sublabel: this.$t('navigation.newFeature.subTitle'),
    visible: true
}

Dialogs

Example dialog

The basic dialog component is src/components/CscDialog.vue.

How to create a new custom dialog

Check the example implementation in src/components/CscDialogChangePassword.vue.

How to call custom dialogs from within a Vue.js Component method

To reduce the boilerplate code of dialog components, we call Dialogs via Quasar Dialog Plugin.

this.$q.dialog({
    component: CscDialogChangePassword,
    parent: this
}).onOk((password) => {
    this.changeWebPassword(password)
})

NGCP API

All API functions are located in src/api. The file src/api/common.js exports basic convenient functions to perform API requests.

Check API Documentation for further details.

Authentication

The standard authentication method to access the API from the browser is the JSON Web Token (JWT) which is specified in RFC7519

After the login request, the JWT is stored in the LocalStorage and is added automatically on each API request.

Fetch a list of items

const list = await getList({
    resource: 'subscribers'
})
list.items.forEach(subscriber => {
    console.log(subscriber.webusername)
})

Fetch a paginated list of items

const list = await getList({
    resource: 'subscribers',
    page: 1,
    rows: 25
})
console.log(list.lastPage)

Fetch a single item

const subscriber = await get({
    resource: 'subscribers',
    resourceId: 21
})
console.log(subscriber.webusername)

Create a new item

If you use post, you create the item and get back the sanitised data. The method postMinimal does exactly the same, except that the body is empty.

const subscriber = await post({
    resource: 'subscribers',
    body: {
        webusername: 'alice',
        ...
    }
})
console.log(subscriber.webusername)
await postMinimal({
    resource: 'subscribers',
    body: {
        webusername: 'alice',
        ...
    }
})

Update an existing item

This method helps to update an entire item at once.

const subscriber = await put({
    resource: 'subscribers',
    resourceId: 21,
    body: {
        webusername: 'bob',
        ...
    }
})
console.log(subscriber.webusername)
await putMinimal({
    resource: 'subscribers',
    resourceId: 21,
    body: {
        webusername: 'bob',
        ...
    }
})

Update a specific field on an existing item

This is the preferred method to update single fields on an item.

await patchReplace({
    resource: 'subscribers',
    resourceId: 21,
    fieldPath: 'webusername',
    value: 'carol'
})
const subscriber = await patchReplaceFull({
    resource: 'subscribers',
    resourceId: 21,
    fieldPath: 'webusername',
    value: 'dave'
})
console.log(subscriber.webusername)