QetriX is a paradigm for creating web apps and websites.
We implemented the idea into several open source QetriX Frameworks, available for various languages and platforms, incl. C#, PHP, JavaScript and others. Their main focus is on HTML5, which has been popular in both online and offline solutions for the past few years.
With QetriX Framework you build apps in just-enough and low-effort manner, using as few as three components: QList, QForm and QView. Each component transforms data provided by datastores to a representation defined by converters.
The framework is robust and powerful, yet fairly simple, performant and lightweight. We used it for enough solutions to know it provides everything you'll ever need in most cases.
Many platforms, single coding style. Quick and easy way how to make apps for various targets, using components, converters and datastores. Scriptable with Que language.
JSON-based proprietary Framework extension for rapid development of rich HTML5 websites and applications. Offers data modeller, layout designer, process builder and more.
Particle database schema for dynamically structured and interlinked semantic data. Also features geographical extension.
Database for anything (and maybe one day of everything): people, food, songs, products, places, machines, software, movies, companies etc. QB allows to add, view, edit and compare them.
Social network, where users can rate anything on a scale from 1 (worst) to 5 (best). Uses data from QB.
Quick Wiki - easy to use online and offline personal wiki with QPDB support. It's decentralized and works also as a simple CMS for websites, blogs and galleries.
ERP for companies and individuals. Contains basic Project Management with Time Tracker (called Quo), CRM, Asset Management, Service Desk, CMDB and more.
Time tracker, tasks and to-dos. Standalone part of Quid.
Trip planner, flight log, travel diary and geo tracker. Works great in connection with Qarate and Quid. Online or offline usage.
Closed-circuit Smart Home information system and family hub to help you with day-to-day tasks, like shopping, cooking or fitness. Supports various devices and appliances.
Lightweight feed reader, e-mail client and messenger. Currently works best with RSS, Twitter and IMAP.
Cross-genre multiplatform videogame, where you can groom your family of Qules in an open world and in the real world.
Czech internet multiportal, featuring news, articles, discussion boards and forums, Q/A, games, blogs, reviews and more.
public class PageInJava extends QModule
{
public String main(Dict args)
{
var view = new QView("form");
view.heading("Page in Java");
view.add("This is a HTML page in Java.");
return view.convert("page");
}
}
class TableInPHP extends QModule
{
public function table(Dict $args)
{
$tbl = new QList(__METHOD__);
$tbl->heading("Table in PHP");
$tbl->add(QElem::create(ElemType::number, "id", "ID");
$tbl->add(QElem::create(ElemType::text, "name", "Name");
$tbl->data($this->ds()->getTableData());
return $tbl->convert("table");
}
}
public class FormInCS : QModule
{
public String form(Dict args)
{
var frm = new QForm("form");
frm.heading("Form in C#");
frm.add(new QElem(ElemType.text, "email", "E-mail", "", 10));
frm.add((new QElem(ElemType.button)).action("formSubmit"));
return frm.convert();
}
}
class com.qetrix.modules.person extends QModule
{
var _data = {};
$public.main = function (args) // Default method for every Module
{
_data.name = args.get("name");
}
$public.name = function (args)
{
return _data.name;
}
return $public;
};
Older version of JavaScript, compatible with Internet Explorer 11
com.qetrix.modules.person = function($public)
{
var _data = {};
main(args) // Default method for every Module
{
_data.name = args.get("name");
}
get name()
{
return _data.name;
}
};
class NavInPython(QModule):
def nav()
nav = QList("nav");
nav.add({"text":"First", "action":"first.html"});
nav.add({"text":"Second", "action":"second.html"});
nav.add({"text":"third", "action":"third.html"});
nav.actionBase(self.page().pathBase());
nav.value(self.page().path());
return nav.convert();
class RubyOracleDs < DataStore
def self.getTableData()
return self.get("SELECT a, b, c FROM ".self.prefix()."qtable WHERE d = 1 ORDER BY a, b DESC");
end
end
fun QList_Xml(list: QList): String {
val sb = StringBuilder()
sb.append("<").append(qlist.name()).append(">")
// ...
sb.append("</").append(qlist.name()).append(">")
return sb.toString();
}
func swiftMod(args: Dict) -> String {
let str = "It works!"
return str
}
class NodeHttpDs extends DataStore
def self.getTableData()
return self.get("SELECT a, b, c FROM ".self.prefix()."table WHERE c = 1 ORDER BY a, b DESC");
end
end
class FormInTS extends QModule
{
public form(Dict args): string
{
var frm = new QForm("form");
frm.heading("Form in TypeScript");
frm.add(new QElem(ElemType.text, "email", "E-mail", "", 10));
frm.add((new QElem(ElemType.button)).action("formSubmit"));
return frm.convert();
}
}
qview:page heading:Module in Que
#1.add Lorem ipsum dolor sit amet
qform:search
#3.add:text
#3.add:button
#1.add #3
#1.convert html page
fn rustmssqlds(x: Dict) -> string
{
def self.getTableData()
return self.get("SELECT a, b, c FROM ".self.prefix()."table WHERE c = 1 ORDER BY a, b DESC");
}
func QList_Json(list QList) string
{
var buffer bytes.Buffer
buffer.WriteString("{")
// ...
buffer.WriteString("}")
return buffer.String();
}
function NavInLua(args)
local nav = QList:create()
nav.data(this.ds().nav()); // Load data from e.g. database
nav.actionBase(this.page().pathBase());
nav.value(this.page().path());
return nav:convert()
end
CREATE TABLE `p` (
`p_pk` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Primary Key (ID)',
`pp_fk` INT(10) UNSIGNED NOT NULL COMMENT 'Entity (p.p_pk of a parent Particle)',
`pt_fk` INT(10) UNSIGNED NOT NULL COMMENT 'Classification or Type (t.t_pk)',
`pv` VARCHAR(200) NULL DEFAULT NULL COMMENT 'Value' COLLATE 'utf8_unicode_ci',
`pr_fk` INT(10) UNSIGNED NULL DEFAULT NULL COMMENT 'Relation (p.p_pk of a foreign Particle)',
`ps` INT(10) NOT NULL DEFAULT '0' COMMENT 'Sort order, significance',
PRIMARY KEY (`p_pk`),
INDEX `pt` (`pt_fk`),
INDEX `pp` (`pp_fk`),
INDEX `pr` (`pr_fk`)
)
COLLATE='utf8_unicode_ci';
{
"p_pk": 24,
"pp_fk": 24,
"pt_fk": 7,
"pv": "QetriX",
"pr_fk": null,
"ps": 999
}
You can also check source code for different languages on GitHub.