Supported since Release 0.9 (Isfahan).
Please Note! Plugins are in beta (since Release Isfahan) and installation or the overall API may change!
Before actually creating a plugin, here is how the folder structure of your plugin has to be:
App
: Hosting your Laravel Models and aninfo.xml
file with several metadata of your pluginControllers
: Hosting your Laravel ControllersMigration
: Place your migration files herejs
: This is the destination folder for your Vue/JavaScript code. Important: Bundle all your JavaScript code into a singlescript.js
file!routes
: Place for your (API) routes to connect your JS code with the Laravel Backend (api.php
)
The easiest way to setup a new plugin is to start with an empty vue-cli project.
vue create spacialist_my_plugin
For further information on how to install vue-cli, please head to their page.
Your package.json
should look something like this:
{
// ...
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"core-js": "^3.15.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.13",
"@vue/cli-plugin-eslint": "~4.5.13",
"@vue/cli-service": "~4.5.13",
"@vue/compiler-sfc": "^3.1.5",
"babel-eslint": "^10.1.0",
"eslint": "^7.31.0",
"eslint-plugin-vue": "^7.14.0",
"vue": "^3.1.5"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/vue3-essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {
"no-unused-vars": "off",
"vue/no-dupe-keys": "off",
"no-undef": "off"
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
Edit/Create the following files for the neccessary configs:
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset',
],
}
module.exports = {
productionSourceMap: false,
chainWebpack: config => {
config.optimization.delete('splitChunks')
},
filenameHashing: false,
}
Then, create all the needed folders:
mkdir App
mkdir Controllers
mkdir Migration
mkdir js
mkdir -p src/components
mkdir src/i18n
This File is mandatory and stores all the information about your plugin. Author, Licence, Version, Description, ...
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<info>
<name>Plugin</name> <!-- is the ID of your plugin -->
<title>Awesome Plugin</title> <!-- Title is shown in Plugin Overview page -->
<description>This is my awesome Plugin!</description> <!-- -->
<version>3.0.1</version> <!-- Current version. A higher version triggers running new migrations -->
<licence>agpl</licence>
<authors>
<author>Vinzenz Rosenkranz</author>
</authors>
</info>
In permissions.json
you can define any new permission (set) needed for your plugin. Each set is an array identified by an unique key. This array consists of five objects with three keys (name
, display_name
and description
) where name
must be one of:
read
write
create
delete
share
role-presets.json
can be used to extend existing core role sets. It consists of an array of objects. Each object has two keys (extends
and rule_set
). Value of extends
is the name of the core role-preset (e.g. administrator
or guest
). rule_set
is an array of all permissions from all your sets you want that role to have (e.g. ['my_plugin_read', 'my_plugin_delete']
).
Spacialist exposes two global functions inside the global SpPS
object.
register({})
: Is used to register a new plugin. Parameters are:
{
id: 'Your ID', // id of your plugin, used to reference that plugin in different slots
// holds your translations per language. languageKey is e.g. en, de, fr, ... (based on vue-i18n)
// All keys are prefixed with 'plugin.', so remember to use that prefix in t() method
i18n: {
languageKeyA: ...,
languageKeyB: ...,
// ...
}
}
intoSlot({})
: A plugin can be installed into different slots. Currently supported are tab
, tools
or settings
.
{
of: 'Your ID', // mandatory,
slot: 'tab', // slot to load that part into, defaults to tab
icon: '', // Icon that should be displayed at the spot (FontAwesome; e.g. 'fa-folder')
label: '', // Translation key that should be displayed at the spot (e.g. 'plugin.file.title')
component: '', // Component you want to show in the slot (only for tab), can be template string or imported component
componentTag: '', // Provide a tag to prevent colliding components (is prefixed by 'sp-plugin-')
}
Your plugin has to be exported as lib without bundled Vue. Vue is globally available in Spacialist and bundled Vue would break Reactivity and other stuff (e.g. Text Nodes)
t()
for translations is also globally available. You only have to return t
inside your setup()
function to use it inside your templates.
To install a plugin simply copy the contents of the created folders above (excluding src
) and reload the plugin page in Spacialist. You should now see your plugin as "Not installed" on the page and you can install it by clicking on the "Install" button.
Spacialist will now automatically load your bundled script.js
file.