@hashtagcms/admin-ui-kit 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/dist/admin-ui-kit.min.css +14 -0
- package/dist/admin-ui-kit.min.js +2 -0
- package/dist/admin-ui-kit.min.js.LICENSE.txt +175 -0
- package/package.json +53 -0
- package/packages/components/README.md +92 -0
- package/packages/components/package.json +28 -0
- package/packages/components/src/action-bar.vue +237 -0
- package/packages/components/src/category-platform.vue +97 -0
- package/packages/components/src/category-settings.vue +815 -0
- package/packages/components/src/cms-module-dropdown.vue +78 -0
- package/packages/components/src/downlods.vue +21 -0
- package/packages/components/src/file-uploader.vue +188 -0
- package/packages/components/src/frontend-module-creator.vue +599 -0
- package/packages/components/src/global-site-button.vue +94 -0
- package/packages/components/src/homepage.vue +1087 -0
- package/packages/components/src/html-slot.vue +23 -0
- package/packages/components/src/image-gallery.vue +144 -0
- package/packages/components/src/index.js +53 -0
- package/packages/components/src/info-boxes.vue +68 -0
- package/packages/components/src/info-popup.vue +121 -0
- package/packages/components/src/language-button.vue +80 -0
- package/packages/components/src/language-copier.vue +177 -0
- package/packages/components/src/left-nav.vue +159 -0
- package/packages/components/src/library/copy-paste.vue +186 -0
- package/packages/components/src/library/info-box.vue +102 -0
- package/packages/components/src/library/left-menu-show-hide.vue +47 -0
- package/packages/components/src/library/loader.vue +141 -0
- package/packages/components/src/library/modal-box.vue +136 -0
- package/packages/components/src/library/split-button.vue +127 -0
- package/packages/components/src/library/timer-button.vue +43 -0
- package/packages/components/src/library/toast-box.vue +53 -0
- package/packages/components/src/menu-sorter.vue +265 -0
- package/packages/components/src/module-creator.vue +650 -0
- package/packages/components/src/module-permission.vue +334 -0
- package/packages/components/src/pagination.vue +125 -0
- package/packages/components/src/platform-button.vue +118 -0
- package/packages/components/src/search-bar.vue +144 -0
- package/packages/components/src/site-button.vue +42 -0
- package/packages/components/src/site-cloner.vue +150 -0
- package/packages/components/src/sitewise-copier.vue +234 -0
- package/packages/components/src/sitewise-data.vue +347 -0
- package/packages/components/src/sorter.vue +239 -0
- package/packages/components/src/tabular-view.vue +824 -0
- package/packages/components/src/title-bar.vue +76 -0
- package/packages/components/src/top-nav.vue +96 -0
- package/packages/helpers/README.md +88 -0
- package/packages/helpers/package.json +20 -0
- package/packages/helpers/src/admin-config.js +9 -0
- package/packages/helpers/src/common.js +89 -0
- package/packages/helpers/src/dashboard.js +16 -0
- package/packages/helpers/src/editor.js +163 -0
- package/packages/helpers/src/error-message-handler.js +50 -0
- package/packages/helpers/src/event-bus.js +4 -0
- package/packages/helpers/src/form.js +4 -0
- package/packages/helpers/src/fx.js +106 -0
- package/packages/helpers/src/humanize.js +14 -0
- package/packages/helpers/src/map.js +3 -0
- package/packages/styles/README.md +37 -0
- package/packages/styles/package.json +15 -0
- package/packages/styles/src/_action-bar.scss +35 -0
- package/packages/styles/src/_admin.scss +22 -0
- package/packages/styles/src/_animate.scss +1579 -0
- package/packages/styles/src/_badges.scss +34 -0
- package/packages/styles/src/_category-list.scss +14 -0
- package/packages/styles/src/_common.scss +163 -0
- package/packages/styles/src/_info-box.scss +96 -0
- package/packages/styles/src/_left-nav.scss +59 -0
- package/packages/styles/src/_loader.scss +82 -0
- package/packages/styles/src/_menu-sorter.scss +39 -0
- package/packages/styles/src/_model-creator.scss +48 -0
- package/packages/styles/src/_module-permission.scss +25 -0
- package/packages/styles/src/_page-manager.scss +63 -0
- package/packages/styles/src/_popover-modal.scss +20 -0
- package/packages/styles/src/_table-grid.scss +39 -0
- package/packages/styles/src/_toast.scss +20 -0
- package/packages/styles/src/_variables.scss +37 -0
- package/packages/styles/src/app.scss +2 -0
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<form
|
|
4
|
+
:action="saveURL"
|
|
5
|
+
class="form-horizontal"
|
|
6
|
+
method="post"
|
|
7
|
+
role="form"
|
|
8
|
+
v-on:keyup="hideErrorMessage($event)"
|
|
9
|
+
v-on:submit.prevent="createModule"
|
|
10
|
+
>
|
|
11
|
+
<div class="form-group row">
|
|
12
|
+
<label class="col-sm-10">
|
|
13
|
+
<input
|
|
14
|
+
v-model="form.createFiles"
|
|
15
|
+
type="checkbox"
|
|
16
|
+
name="create-validator"
|
|
17
|
+
/>
|
|
18
|
+
Create Files (Controller/Model/View/Vaidator) -
|
|
19
|
+
<small class="text-info"
|
|
20
|
+
>Try creating it from terminal command. It might not work due to
|
|
21
|
+
rights</small
|
|
22
|
+
>
|
|
23
|
+
</label>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<input v-model="form.display_name" type="hidden" />
|
|
27
|
+
<div class="form-group row">
|
|
28
|
+
<label class="col-sm-3">Name</label>
|
|
29
|
+
<div class="col-sm-7">
|
|
30
|
+
<input
|
|
31
|
+
v-model="form.name"
|
|
32
|
+
class="form-control"
|
|
33
|
+
name="name"
|
|
34
|
+
placeholder="Module name"
|
|
35
|
+
required
|
|
36
|
+
type="text"
|
|
37
|
+
@blur="updateControllerName()"
|
|
38
|
+
/>
|
|
39
|
+
<div class="text text-danger">{{ this.errors.name }}</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div class="form-group row">
|
|
44
|
+
<label class="col-sm-3">Sub Title</label>
|
|
45
|
+
<div class="col-sm-7">
|
|
46
|
+
<input
|
|
47
|
+
v-model="form.sub_title"
|
|
48
|
+
class="form-control"
|
|
49
|
+
name="name"
|
|
50
|
+
placeholder="Sub title"
|
|
51
|
+
type="text"
|
|
52
|
+
/>
|
|
53
|
+
<div class="text text-danger">{{ this.errors.sub_title }}</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div class="form-group row">
|
|
58
|
+
<label class="col-sm-3">Controller Name (link rewrite)</label>
|
|
59
|
+
<div class="col-sm-7">
|
|
60
|
+
<input
|
|
61
|
+
v-model="form.controller_name"
|
|
62
|
+
class="form-control"
|
|
63
|
+
name="controller_name"
|
|
64
|
+
placeholder="Controller name"
|
|
65
|
+
required
|
|
66
|
+
type="text"
|
|
67
|
+
@blur="updateControllerName(form.controller_name)"
|
|
68
|
+
/>
|
|
69
|
+
<div class="text text-danger">{{ this.errors.controller_name }}</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<div class="form-group row">
|
|
74
|
+
<label class="col-sm-3">Parent</label>
|
|
75
|
+
<div class="col-sm-7">
|
|
76
|
+
<select v-model="form.parent_id" class="form-select select-big">
|
|
77
|
+
<option value="">Select</option>
|
|
78
|
+
<option v-for="module in allModules" :value="module.id">
|
|
79
|
+
{{ module.name }}
|
|
80
|
+
</option>
|
|
81
|
+
</select>
|
|
82
|
+
|
|
83
|
+
<div class="text text-danger">{{ this.errors.parent_id }}</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<div class="form-group row">
|
|
88
|
+
<label class="col-sm-3">Icon CSS</label>
|
|
89
|
+
<div class="col-sm-7">
|
|
90
|
+
<input
|
|
91
|
+
v-model="form.icon_css"
|
|
92
|
+
class="form-control"
|
|
93
|
+
name="name"
|
|
94
|
+
placeholder="Icon CSS"
|
|
95
|
+
required
|
|
96
|
+
type="text"
|
|
97
|
+
/>
|
|
98
|
+
<div class="text text-danger">{{ this.errors.icon_css }}</div>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<div class="form-group row">
|
|
103
|
+
<label class="col-sm-3">List View Name</label>
|
|
104
|
+
<div class="col-sm-7">
|
|
105
|
+
<input
|
|
106
|
+
v-model="form.list_view_name"
|
|
107
|
+
class="form-control"
|
|
108
|
+
name="name"
|
|
109
|
+
placeholder="Enter list view Name (Default list view is common/listing)"
|
|
110
|
+
type="text"
|
|
111
|
+
/>
|
|
112
|
+
<div class="text text-danger">{{ this.errors.list_view_name }}</div>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
<div class="form-group row">
|
|
116
|
+
<label class="col-sm-3">Edit View Name</label>
|
|
117
|
+
<div class="col-sm-7">
|
|
118
|
+
<input
|
|
119
|
+
v-model="form.edit_view_name"
|
|
120
|
+
class="form-control"
|
|
121
|
+
name="name"
|
|
122
|
+
placeholder="Edit list view Name (Default edit view is addedit)"
|
|
123
|
+
type="text"
|
|
124
|
+
/>
|
|
125
|
+
<div class="text text-danger">{{ this.errors.edit_view_name }}</div>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<div v-if="form.createFiles">
|
|
130
|
+
<div class="form-group row">
|
|
131
|
+
<label class="col-sm-3">Data Source</label>
|
|
132
|
+
<div class="col-sm-7">
|
|
133
|
+
<select
|
|
134
|
+
v-model="mainModel.tableName"
|
|
135
|
+
class="form-select select-big"
|
|
136
|
+
@change="populateMainDataFields()"
|
|
137
|
+
>
|
|
138
|
+
<option value="">Select</option>
|
|
139
|
+
<option v-for="table in allTables" :value="table.name">
|
|
140
|
+
{{ table.name }}
|
|
141
|
+
</option>
|
|
142
|
+
</select>
|
|
143
|
+
<div class="col-sm-5">
|
|
144
|
+
<span v-if="mainModel.tableName != ''" class="models">
|
|
145
|
+
{{ getModelName(mainModel.tableName) }}
|
|
146
|
+
</span>
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
<div class="form-group row">
|
|
152
|
+
<label class="col-sm-3">Data with? Choose another model.</label>
|
|
153
|
+
<div class="col-sm-7">
|
|
154
|
+
<select
|
|
155
|
+
v-model="relationModels.tableName"
|
|
156
|
+
class="form-select select-big"
|
|
157
|
+
@change="addRelationModel()"
|
|
158
|
+
>
|
|
159
|
+
<option value="">Select</option>
|
|
160
|
+
<option v-for="table in allTables" :value="table.name">
|
|
161
|
+
{{ table.name }}
|
|
162
|
+
</option>
|
|
163
|
+
</select>
|
|
164
|
+
|
|
165
|
+
<div>
|
|
166
|
+
<fieldset v-if="hasRelation()" class="fieldset">
|
|
167
|
+
<legend class="small legendTitle">Relation Models</legend>
|
|
168
|
+
<div
|
|
169
|
+
v-for="(rModel, index) in relationModels.models"
|
|
170
|
+
class="models_row"
|
|
171
|
+
>
|
|
172
|
+
<span class="models">
|
|
173
|
+
{{ rModel.model }}
|
|
174
|
+
<input
|
|
175
|
+
:value="rModel.relationAlias"
|
|
176
|
+
name="relation"
|
|
177
|
+
placeholder="Relation name"
|
|
178
|
+
type="text"
|
|
179
|
+
@change="
|
|
180
|
+
updateRelationModel($event, index, 'relationAlias')
|
|
181
|
+
"
|
|
182
|
+
/>
|
|
183
|
+
<select
|
|
184
|
+
class="select"
|
|
185
|
+
name="relationType"
|
|
186
|
+
@change="
|
|
187
|
+
updateRelationModel($event, index, 'relationType')
|
|
188
|
+
"
|
|
189
|
+
>
|
|
190
|
+
<option value="hasMany">hasMany</option>
|
|
191
|
+
<option value="belongsTo">belongsTo</option>
|
|
192
|
+
<option value="hasOne">hasOne</option>
|
|
193
|
+
</select>
|
|
194
|
+
isLanguage:
|
|
195
|
+
<input
|
|
196
|
+
v-model="rModel.isLanguage"
|
|
197
|
+
type="checkbox"
|
|
198
|
+
name="relationModel"
|
|
199
|
+
/>
|
|
200
|
+
<span
|
|
201
|
+
class="small fa fa-close"
|
|
202
|
+
@click="removeRelationModel(index, rModel.model)"
|
|
203
|
+
></span>
|
|
204
|
+
</span>
|
|
205
|
+
</div>
|
|
206
|
+
</fieldset>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
<div class="row" v-if="hasMainDataSource()">
|
|
211
|
+
<strong>Click on fields to choose</strong>
|
|
212
|
+
</div>
|
|
213
|
+
<div v-if="hasMainDataSource()" class="form-group row">
|
|
214
|
+
<div class="col-auto">
|
|
215
|
+
<div class="card shadow-sm models-box">
|
|
216
|
+
<div class="card-header">
|
|
217
|
+
<span
|
|
218
|
+
class="text-small pull-right hand text-success"
|
|
219
|
+
@click="selectAllField(mainModel)"
|
|
220
|
+
>Add all »</span
|
|
221
|
+
>{{ getModelName(mainModel.tableName) }}<br />
|
|
222
|
+
</div>
|
|
223
|
+
<div class="card-body p-0 m-0 tables_panel">
|
|
224
|
+
<ul class="list-group list-group-flush">
|
|
225
|
+
<li
|
|
226
|
+
class="list-group-item"
|
|
227
|
+
v-for="field in mainModel.fields"
|
|
228
|
+
@click="selectField(field, mainModel)"
|
|
229
|
+
>
|
|
230
|
+
{{ field }}
|
|
231
|
+
</li>
|
|
232
|
+
</ul>
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
<template v-if="hasRelation()">
|
|
237
|
+
<div
|
|
238
|
+
class="col-auto"
|
|
239
|
+
v-for="(rModel, index) in relationModels.models"
|
|
240
|
+
>
|
|
241
|
+
<div class="card shadow-sm models-box">
|
|
242
|
+
<div class="card-header">
|
|
243
|
+
<span
|
|
244
|
+
class="text-small pull-right hand text-success"
|
|
245
|
+
@click="selectAllField(mainModel, rModel.relationAlias)"
|
|
246
|
+
>Add all »</span
|
|
247
|
+
>{{ rModel.model }}<br />->with['{{ rModel.relationAlias }}']
|
|
248
|
+
</div>
|
|
249
|
+
<div class="card-body p-0 m-0 tables_panel">
|
|
250
|
+
<ul class="list-group list-group-flush">
|
|
251
|
+
<li
|
|
252
|
+
class="list-group-item"
|
|
253
|
+
v-for="field in rModel.fields"
|
|
254
|
+
@click="
|
|
255
|
+
selectField(field, mainModel, rModel.relationAlias)
|
|
256
|
+
"
|
|
257
|
+
>
|
|
258
|
+
{{ field }}
|
|
259
|
+
</li>
|
|
260
|
+
</ul>
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
</template>
|
|
265
|
+
</div>
|
|
266
|
+
<div class="row mt-3" v-if="mainModel.selected.length > 0">
|
|
267
|
+
<div class="col">
|
|
268
|
+
<div class="card shadow-sm">
|
|
269
|
+
<div class="card-header">
|
|
270
|
+
Selected Fields
|
|
271
|
+
<span
|
|
272
|
+
class="text-small pull-right hand text-danger"
|
|
273
|
+
@click="removeAllField(mainModel)"
|
|
274
|
+
>Remove all</span
|
|
275
|
+
>
|
|
276
|
+
</div>
|
|
277
|
+
<div class="card-body">
|
|
278
|
+
<ul id="selectedFields">
|
|
279
|
+
<li
|
|
280
|
+
class="fields non-selectable"
|
|
281
|
+
v-for="(val, index) in mainModel.selected"
|
|
282
|
+
:data-fieldname="val"
|
|
283
|
+
>
|
|
284
|
+
{{ val }}
|
|
285
|
+
<span
|
|
286
|
+
class="small fa fa-close"
|
|
287
|
+
@click="removeField(mainModel, index)"
|
|
288
|
+
></span>
|
|
289
|
+
</li>
|
|
290
|
+
</ul>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
|
|
297
|
+
<div class="row mt-3">
|
|
298
|
+
<div v-if="errorMessage !== ''" class="alert alert-danger">
|
|
299
|
+
{{ errorMessage }}
|
|
300
|
+
</div>
|
|
301
|
+
<div class="form-group center-align">
|
|
302
|
+
<input
|
|
303
|
+
class="btn btn-success btn-from-submit"
|
|
304
|
+
name="submit"
|
|
305
|
+
type="submit"
|
|
306
|
+
value="Save"
|
|
307
|
+
/>
|
|
308
|
+
<a :href="dataBackUrl" class="btn btn-outline-secondary">Cancel</a>
|
|
309
|
+
</div>
|
|
310
|
+
</div>
|
|
311
|
+
</form>
|
|
312
|
+
</div>
|
|
313
|
+
</template>
|
|
314
|
+
|
|
315
|
+
<script>
|
|
316
|
+
import AdminConfig from "@hashtagcms/helpers/admin-config";
|
|
317
|
+
import axios from "axios";
|
|
318
|
+
|
|
319
|
+
import { Toast } from "@hashtagcms/helpers/common";
|
|
320
|
+
import Form from "@hashtagcms/helpers/form";
|
|
321
|
+
import Sortable from "sortablejs";
|
|
322
|
+
import pluralize from "pluralize";
|
|
323
|
+
|
|
324
|
+
class DbData {
|
|
325
|
+
static get data() {
|
|
326
|
+
return {};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
static getFields(table) {
|
|
330
|
+
return new Promise((resolve, reject) => {
|
|
331
|
+
axios
|
|
332
|
+
.get("getFields?table=" + table)
|
|
333
|
+
.then(function (res) {
|
|
334
|
+
resolve(res);
|
|
335
|
+
})
|
|
336
|
+
.catch(function () {
|
|
337
|
+
reject(this);
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
export default {
|
|
344
|
+
mounted() {
|
|
345
|
+
//console.log("backUrl "+this.dataBackUrl)
|
|
346
|
+
//console.log(this.controllerName);
|
|
347
|
+
},
|
|
348
|
+
props: [
|
|
349
|
+
"dataDatabaseTables",
|
|
350
|
+
"dataControllerName",
|
|
351
|
+
"dataBackUrl",
|
|
352
|
+
"dataCmsModules",
|
|
353
|
+
],
|
|
354
|
+
computed: {
|
|
355
|
+
saveURL: function () {
|
|
356
|
+
return AdminConfig.admin_path(this.dataControllerName + "/createModule");
|
|
357
|
+
},
|
|
358
|
+
},
|
|
359
|
+
data() {
|
|
360
|
+
return {
|
|
361
|
+
allTables:
|
|
362
|
+
typeof this.dataDatabaseTables !== "undefined"
|
|
363
|
+
? JSON.parse(this.dataDatabaseTables)
|
|
364
|
+
: [],
|
|
365
|
+
allModules:
|
|
366
|
+
typeof this.dataCmsModules !== "undefined"
|
|
367
|
+
? JSON.parse(this.dataCmsModules)
|
|
368
|
+
: [],
|
|
369
|
+
mainModel: { tableName: "", fields: [], modelName: "", selected: [] },
|
|
370
|
+
relationModels: { tableName: "", models: [] },
|
|
371
|
+
|
|
372
|
+
form: new Form({
|
|
373
|
+
name: "",
|
|
374
|
+
controller_name: "",
|
|
375
|
+
validator_name: "",
|
|
376
|
+
dataWith: [],
|
|
377
|
+
dataSource: "",
|
|
378
|
+
createFiles: true,
|
|
379
|
+
selectedFields: [],
|
|
380
|
+
relationModels: [],
|
|
381
|
+
parent_id: "",
|
|
382
|
+
display_name: "",
|
|
383
|
+
sub_title: "",
|
|
384
|
+
icon_css: "",
|
|
385
|
+
list_view_name: "",
|
|
386
|
+
edit_view_name: "",
|
|
387
|
+
}),
|
|
388
|
+
errors: {},
|
|
389
|
+
cacheData: {},
|
|
390
|
+
sortable: null,
|
|
391
|
+
sortingInterval: -1,
|
|
392
|
+
errorMessage: "",
|
|
393
|
+
};
|
|
394
|
+
},
|
|
395
|
+
methods: {
|
|
396
|
+
updateControllerName(controller_name) {
|
|
397
|
+
let name = controller_name || this.form.name;
|
|
398
|
+
name = name.toLowerCase().replace(/\s/g, "");
|
|
399
|
+
|
|
400
|
+
this.form.controller_name = pluralize.singular(name);
|
|
401
|
+
this.form.validator_name = this.form.controller_name;
|
|
402
|
+
|
|
403
|
+
//check controller existence
|
|
404
|
+
if (controller_name !== undefined) {
|
|
405
|
+
this.isControllerExists(this.form.controller_name);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
this.form.icon_css = this.form.controller_name;
|
|
409
|
+
|
|
410
|
+
//console.log("this.form.validator_name "+this.form.validator_name);
|
|
411
|
+
},
|
|
412
|
+
getModelName(modelName = "") {
|
|
413
|
+
let tableName = modelName;
|
|
414
|
+
let $this = this;
|
|
415
|
+
modelName = pluralize.singular(modelName) + "::class";
|
|
416
|
+
let arr = modelName.split("_");
|
|
417
|
+
arr = arr.map((a) => a.charAt(0).toUpperCase() + a.substr(1, a.length));
|
|
418
|
+
|
|
419
|
+
return arr.join("");
|
|
420
|
+
},
|
|
421
|
+
populateMainDataFields() {
|
|
422
|
+
let $this = this;
|
|
423
|
+
if (this.mainModel.tableName !== "") {
|
|
424
|
+
this.mainModel.fields = ["Please wait..."];
|
|
425
|
+
DbData.getFields(this.mainModel.tableName).then(function (res) {
|
|
426
|
+
$this.mainModel.fields = res.data;
|
|
427
|
+
});
|
|
428
|
+
this.mainModel.modelName = this.getModelName(this.mainModel.tableName);
|
|
429
|
+
this.form.dataSource = this.mainModel.modelName;
|
|
430
|
+
}
|
|
431
|
+
},
|
|
432
|
+
updateWithData() {
|
|
433
|
+
this.form.dataWith = [];
|
|
434
|
+
for (let i = 0; i < this.relationModels.models.length; i++) {
|
|
435
|
+
let current = this.relationModels.models[i];
|
|
436
|
+
if (this.form.dataWith.indexOf(current.relationAlias) === -1) {
|
|
437
|
+
this.form.dataWith.push(current.relationAlias);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
},
|
|
441
|
+
addRelationModel() {
|
|
442
|
+
if (this.relationModels.tableName !== "") {
|
|
443
|
+
let tableName = this.relationModels.tableName;
|
|
444
|
+
let modelName = this.getModelName(tableName);
|
|
445
|
+
|
|
446
|
+
if (this.hasInRelationModel(modelName) === false) {
|
|
447
|
+
let relationAlias = "";
|
|
448
|
+
if (tableName.endsWith("_langs") || tableName.endsWith("_sites")) {
|
|
449
|
+
relationAlias = tableName.endsWith("_langs") ? "lang" : "site";
|
|
450
|
+
} else {
|
|
451
|
+
relationAlias = pluralize
|
|
452
|
+
.singular(tableName.replace(/_/g, ""))
|
|
453
|
+
.toLowerCase();
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
let isLanguage = relationAlias === "lang";
|
|
457
|
+
|
|
458
|
+
let relationType = "hasMany";
|
|
459
|
+
|
|
460
|
+
let relationalData = {
|
|
461
|
+
model: modelName,
|
|
462
|
+
relationAlias: relationAlias,
|
|
463
|
+
relationType: relationType,
|
|
464
|
+
isLanguage: isLanguage,
|
|
465
|
+
fields: [],
|
|
466
|
+
selected: [],
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
//not to show same table again.
|
|
470
|
+
if (!this.cacheData[modelName]) {
|
|
471
|
+
this.relationModels.models.push(relationalData);
|
|
472
|
+
}
|
|
473
|
+
//Add in cache
|
|
474
|
+
this.cacheData[modelName] = relationalData;
|
|
475
|
+
this.cacheData[modelName].fields = ["Please wait..."];
|
|
476
|
+
DbData.getFields(tableName).then((res) => {
|
|
477
|
+
this.cacheData[modelName].fields = res.data;
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
this.updateWithData();
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
hasInRelationModel(modelName) {
|
|
485
|
+
return this.cacheData[modelName] || false;
|
|
486
|
+
},
|
|
487
|
+
updateRelationModel(event, index, key) {
|
|
488
|
+
let alias = this.relationModels.models[index][key];
|
|
489
|
+
this.relationModels.models[index][key] = event.target.value;
|
|
490
|
+
|
|
491
|
+
if (key === "relationAlias") {
|
|
492
|
+
//reset
|
|
493
|
+
this.relationModels.models[index].selected = [];
|
|
494
|
+
this.removeSelectedRelationFields(alias);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
this.updateWithData();
|
|
498
|
+
},
|
|
499
|
+
removeSelectedRelationFields(alias) {
|
|
500
|
+
if (this.mainModel.selected.length > 0) {
|
|
501
|
+
let selected = [];
|
|
502
|
+
for (let i = 0; i < this.mainModel.selected.length; i++) {
|
|
503
|
+
let current = this.mainModel.selected[i];
|
|
504
|
+
if (!current.startsWith(alias + ".")) {
|
|
505
|
+
selected.push(current);
|
|
506
|
+
} else {
|
|
507
|
+
// this.mainModel.selected.splice(i, 1); this is not working
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
this.mainModel.selected = selected;
|
|
511
|
+
}
|
|
512
|
+
},
|
|
513
|
+
removeRelationModel(index, model) {
|
|
514
|
+
let alias = this.relationModels.models[index].relationAlias;
|
|
515
|
+
|
|
516
|
+
delete this.cacheData[model];
|
|
517
|
+
this.relationModels.models.splice(index, 1);
|
|
518
|
+
this.relationModels.tableName = "";
|
|
519
|
+
|
|
520
|
+
this.removeSelectedRelationFields(alias);
|
|
521
|
+
},
|
|
522
|
+
hasRelation() {
|
|
523
|
+
return this.relationModels.models.length > 0;
|
|
524
|
+
},
|
|
525
|
+
hasMainDataSource() {
|
|
526
|
+
return this.mainModel.tableName !== "";
|
|
527
|
+
},
|
|
528
|
+
selectAllField(where, relation = "") {
|
|
529
|
+
if (where.selected.length === 0) {
|
|
530
|
+
where.selected = where.fields.slice();
|
|
531
|
+
if (relation !== "") {
|
|
532
|
+
where.selected = where.selected.map((c) => relation + "." + c);
|
|
533
|
+
}
|
|
534
|
+
} else {
|
|
535
|
+
for (let i = 0; i < where.fields.length; i++) {
|
|
536
|
+
this.selectField(where.fields[i], where, relation);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
this.enableSorting();
|
|
541
|
+
},
|
|
542
|
+
selectField(field, where, relation = "") {
|
|
543
|
+
field = relation !== "" ? relation + "." + field : field;
|
|
544
|
+
|
|
545
|
+
if (where.selected.indexOf(field) === -1) {
|
|
546
|
+
where.selected.push(field);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
this.enableSorting();
|
|
550
|
+
},
|
|
551
|
+
removeField(where, index) {
|
|
552
|
+
where.selected.splice(index, 1);
|
|
553
|
+
},
|
|
554
|
+
removeAllField(where) {
|
|
555
|
+
where.selected = [];
|
|
556
|
+
this.form.selectedFields = [];
|
|
557
|
+
},
|
|
558
|
+
isControllerExists(name = "") {
|
|
559
|
+
if (name !== "") {
|
|
560
|
+
let $this = this;
|
|
561
|
+
axios.get("isControllerExists?name=" + name).then(function (res) {
|
|
562
|
+
if (res.data === 1) {
|
|
563
|
+
Toast.show($this, "Controller already exist");
|
|
564
|
+
}
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
},
|
|
568
|
+
createModule() {
|
|
569
|
+
this.setSortedFields();
|
|
570
|
+
this.form.relationModels = this.relationModels;
|
|
571
|
+
|
|
572
|
+
//console.log(this.mainModel);
|
|
573
|
+
//console.log(this.relationModels);
|
|
574
|
+
//console.log(this.form);
|
|
575
|
+
|
|
576
|
+
this.form
|
|
577
|
+
.post(this.saveURL)
|
|
578
|
+
.then((response) => this.resetForm(response))
|
|
579
|
+
.catch((response) => this.showError(response));
|
|
580
|
+
},
|
|
581
|
+
enableSorting() {
|
|
582
|
+
this.$nextTick(function () {
|
|
583
|
+
if (this.sortable != null) {
|
|
584
|
+
this.sortable.destroy();
|
|
585
|
+
}
|
|
586
|
+
let el = document.getElementById("selectedFields");
|
|
587
|
+
this.sortable = Sortable.create(el, {
|
|
588
|
+
onEnd: this.sortingCallback,
|
|
589
|
+
onStart: this.cancelSortingCallback,
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
},
|
|
593
|
+
cancelSortingCallback() {
|
|
594
|
+
if (this.sortingInterval !== -1) {
|
|
595
|
+
clearInterval(this.sortingInterval);
|
|
596
|
+
}
|
|
597
|
+
},
|
|
598
|
+
sortingCallback() {
|
|
599
|
+
this.cancelSortingCallback();
|
|
600
|
+
},
|
|
601
|
+
setSortedFields() {
|
|
602
|
+
let items = document.querySelectorAll("#selectedFields li");
|
|
603
|
+
let count = items.length;
|
|
604
|
+
if (count > 1) {
|
|
605
|
+
let selected = [];
|
|
606
|
+
for (let i = 0; i < count; i++) {
|
|
607
|
+
let current = items[i];
|
|
608
|
+
let field = current.getAttribute("data-fieldname");
|
|
609
|
+
selected.push(field);
|
|
610
|
+
}
|
|
611
|
+
this.form.selectedFields = selected;
|
|
612
|
+
}
|
|
613
|
+
},
|
|
614
|
+
showError(res) {
|
|
615
|
+
this.errors = {};
|
|
616
|
+
for (let i in res.errors) {
|
|
617
|
+
if (res.errors.hasOwnProperty(i)) {
|
|
618
|
+
this.errors[i] = res.errors[i][0];
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
this.errorMessage = res.message;
|
|
623
|
+
},
|
|
624
|
+
hideErrorMessage(event) {
|
|
625
|
+
let name = event.target.getAttribute("name");
|
|
626
|
+
this.errors[name] = "";
|
|
627
|
+
|
|
628
|
+
if (this.errorMessage !== "") {
|
|
629
|
+
this.errorMessage = "";
|
|
630
|
+
}
|
|
631
|
+
},
|
|
632
|
+
resetForm(response) {
|
|
633
|
+
this.mainModel = {
|
|
634
|
+
tableName: "",
|
|
635
|
+
fields: [],
|
|
636
|
+
modelName: "",
|
|
637
|
+
selected: [],
|
|
638
|
+
};
|
|
639
|
+
this.relationModels = { tableName: "", models: [] };
|
|
640
|
+
|
|
641
|
+
if (response.created === 0) {
|
|
642
|
+
Toast.show(this, "There is some error...");
|
|
643
|
+
this.errorMessage = response.message;
|
|
644
|
+
} else {
|
|
645
|
+
Toast.show(this, "Created...");
|
|
646
|
+
}
|
|
647
|
+
},
|
|
648
|
+
},
|
|
649
|
+
};
|
|
650
|
+
</script>
|