forked from picqer/exact-php-client
-
Notifications
You must be signed in to change notification settings - Fork 0
/
userscript.js
116 lines (102 loc) · 3.37 KB
/
userscript.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// ==UserScript==
// @name PHP SDK Entity generator
// @namespace php
// @description Generates php class that can be used in SDK
// @include https://start.exactonline.nl/docs/HlpRestAPIResourcesDetails.aspx?*
// @version 1
// @grant none
// ==/UserScript==
(function() {
var instant_download = false;
/** Add textarea to display php code **/
// Push current content to the left.
$('body > form').css('float', 'left');
$('body > form').css('width', '50%');
$('body > form').css('overflow', 'auto');
// Add textarea to body, css might need some work.
$('<a />', {
id : 'php_download',
text: 'Download Code',
style: 'margin: 10px; padding: 10px; color: white; background-color: red'
}).appendTo('body');
$('<br /><br />').appendTo('body');
$('<textarea/>', {
id : 'php',
style: 'min-height:800px; width: 47%; margin-left:10px;'
}).appendTo('body');
/** Initialize variables **/
var primarykey = 'ID';
var data = {};
// Fetch entity URL and strip '/api/v1/{division}/'
var url = $('#serviceUri').text().replace(/^\/api\/v[0-9]\/[^/]+\//, '');
var prefix = "";
if($('#serviceUri').text().includes('/bulk/')){
prefix = "Bulk";
}
// Last part after slash should be the (plural) class name without the query part
var classname = prefix + url.replace(/.+\/(.+?)s?$/,'$1').replace(/\?.*/,'');
var mapType = function(type) {
switch (type.toLowerCase()) {
case "guid":
case "datetime":
return "string";
case "byte":
case "int32":
case "int16":
return "int";
case "double":
return "float";
case "boolean":
return "bool";
default:
return type.toLowerCase()
}
}
/** Fetch attribute information **/
$('#referencetable tr input').each(function() {
data[$(this).attr('name')] = {
'type' : $(this).attr('data-type').replace('Edm.', ''),
'description' : $(this).parent().siblings('td:last-child').text().trim()
};
// Set primarykey when found. Should be first itteration.
if ($(this).attr('data-key') == "True") {
primarykey = $(this).attr('name');
}
});
/** Build php code **/
phptxt = "<?php\n\nnamespace Picqer\\Financials\\Exact;\n\n/**";
// Build docblock
phptxt += "\n * Class " + classname + ".";
phptxt += "\n *\n * @see " + window.location.href;
phptxt += "\n *";
$.each(data,function(attribute, info){
phptxt += "\n * @property " + mapType(info.type) + " $" + attribute + " " + info.description;
});
phptxt += "\n */";
// Build class
phptxt += "\nclass " + classname + " extends Model\n{\n use Query\\Findable;\n use Persistance\\Storable;";
if (primarykey != 'ID') {
phptxt += "\n\n protected $primaryKey = '" + primarykey + "';";
}
phptxt += "\n\n protected $fillable = [";
$.each(Object.keys(data), function(){
phptxt += "\n '" + this + "',";
});
phptxt += "\n ];";
phptxt += "\n\n protected $url = '" + url + "';";
phptxt += "\n}\n";
// Display php code
$('#php').text(phptxt);
// Present the php code as a download
$('#php_download').attr("href",
URL.createObjectURL(
new Blob([phptxt], {
type: "text/plain"
})
)
).attr('download', classname + '.php');
if (instant_download)
{
$('#php_download')[0].click();
}
})();