@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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/admin-ui-kit.min.css +14 -0
  4. package/dist/admin-ui-kit.min.js +2 -0
  5. package/dist/admin-ui-kit.min.js.LICENSE.txt +175 -0
  6. package/package.json +53 -0
  7. package/packages/components/README.md +92 -0
  8. package/packages/components/package.json +28 -0
  9. package/packages/components/src/action-bar.vue +237 -0
  10. package/packages/components/src/category-platform.vue +97 -0
  11. package/packages/components/src/category-settings.vue +815 -0
  12. package/packages/components/src/cms-module-dropdown.vue +78 -0
  13. package/packages/components/src/downlods.vue +21 -0
  14. package/packages/components/src/file-uploader.vue +188 -0
  15. package/packages/components/src/frontend-module-creator.vue +599 -0
  16. package/packages/components/src/global-site-button.vue +94 -0
  17. package/packages/components/src/homepage.vue +1087 -0
  18. package/packages/components/src/html-slot.vue +23 -0
  19. package/packages/components/src/image-gallery.vue +144 -0
  20. package/packages/components/src/index.js +53 -0
  21. package/packages/components/src/info-boxes.vue +68 -0
  22. package/packages/components/src/info-popup.vue +121 -0
  23. package/packages/components/src/language-button.vue +80 -0
  24. package/packages/components/src/language-copier.vue +177 -0
  25. package/packages/components/src/left-nav.vue +159 -0
  26. package/packages/components/src/library/copy-paste.vue +186 -0
  27. package/packages/components/src/library/info-box.vue +102 -0
  28. package/packages/components/src/library/left-menu-show-hide.vue +47 -0
  29. package/packages/components/src/library/loader.vue +141 -0
  30. package/packages/components/src/library/modal-box.vue +136 -0
  31. package/packages/components/src/library/split-button.vue +127 -0
  32. package/packages/components/src/library/timer-button.vue +43 -0
  33. package/packages/components/src/library/toast-box.vue +53 -0
  34. package/packages/components/src/menu-sorter.vue +265 -0
  35. package/packages/components/src/module-creator.vue +650 -0
  36. package/packages/components/src/module-permission.vue +334 -0
  37. package/packages/components/src/pagination.vue +125 -0
  38. package/packages/components/src/platform-button.vue +118 -0
  39. package/packages/components/src/search-bar.vue +144 -0
  40. package/packages/components/src/site-button.vue +42 -0
  41. package/packages/components/src/site-cloner.vue +150 -0
  42. package/packages/components/src/sitewise-copier.vue +234 -0
  43. package/packages/components/src/sitewise-data.vue +347 -0
  44. package/packages/components/src/sorter.vue +239 -0
  45. package/packages/components/src/tabular-view.vue +824 -0
  46. package/packages/components/src/title-bar.vue +76 -0
  47. package/packages/components/src/top-nav.vue +96 -0
  48. package/packages/helpers/README.md +88 -0
  49. package/packages/helpers/package.json +20 -0
  50. package/packages/helpers/src/admin-config.js +9 -0
  51. package/packages/helpers/src/common.js +89 -0
  52. package/packages/helpers/src/dashboard.js +16 -0
  53. package/packages/helpers/src/editor.js +163 -0
  54. package/packages/helpers/src/error-message-handler.js +50 -0
  55. package/packages/helpers/src/event-bus.js +4 -0
  56. package/packages/helpers/src/form.js +4 -0
  57. package/packages/helpers/src/fx.js +106 -0
  58. package/packages/helpers/src/humanize.js +14 -0
  59. package/packages/helpers/src/map.js +3 -0
  60. package/packages/styles/README.md +37 -0
  61. package/packages/styles/package.json +15 -0
  62. package/packages/styles/src/_action-bar.scss +35 -0
  63. package/packages/styles/src/_admin.scss +22 -0
  64. package/packages/styles/src/_animate.scss +1579 -0
  65. package/packages/styles/src/_badges.scss +34 -0
  66. package/packages/styles/src/_category-list.scss +14 -0
  67. package/packages/styles/src/_common.scss +163 -0
  68. package/packages/styles/src/_info-box.scss +96 -0
  69. package/packages/styles/src/_left-nav.scss +59 -0
  70. package/packages/styles/src/_loader.scss +82 -0
  71. package/packages/styles/src/_menu-sorter.scss +39 -0
  72. package/packages/styles/src/_model-creator.scss +48 -0
  73. package/packages/styles/src/_module-permission.scss +25 -0
  74. package/packages/styles/src/_page-manager.scss +63 -0
  75. package/packages/styles/src/_popover-modal.scss +20 -0
  76. package/packages/styles/src/_table-grid.scss +39 -0
  77. package/packages/styles/src/_toast.scss +20 -0
  78. package/packages/styles/src/_variables.scss +37 -0
  79. package/packages/styles/src/app.scss +2 -0
@@ -0,0 +1,144 @@
1
+ <template>
2
+ <form
3
+ :action="actionUrl"
4
+ method="get"
5
+ v-on:submit.prevent="searchNow"
6
+ class="form-inline"
7
+ role="form"
8
+ >
9
+ <div class="row searchForm justify-content-end">
10
+ <div class="col-auto space-between">
11
+ <div class="form-group">
12
+ <select
13
+ name="fields"
14
+ v-model="searchParams.f"
15
+ class="form-select"
16
+ @change="changeInputText()"
17
+ >
18
+ <option
19
+ v-for="field in searchFields"
20
+ :value="getFieldName(field, 'key')"
21
+ >
22
+ {{ getFieldName(field) }}
23
+ </option>
24
+ </select>
25
+ </div>
26
+ </div>
27
+ <div class="col-auto space-between">
28
+ <select name="fields" v-model="searchParams.o" class="form-select">
29
+ <option v-for="operator in operators" :value="operator">
30
+ {{ operator }}
31
+ </option>
32
+ </select>
33
+ </div>
34
+ <div class="col-auto space-between">
35
+ <input
36
+ :type="inputType"
37
+ v-model="searchParams.q"
38
+ class="form-control"
39
+ placeholder="Search for..."
40
+ />
41
+ </div>
42
+ <div class="col-auto space-between">
43
+ <span class="input-group-btn">
44
+ <input
45
+ type="submit"
46
+ name="submit"
47
+ value="Search"
48
+ class="btn btn-success space-between btn-space"
49
+ />
50
+ <input
51
+ type="reset"
52
+ name="reset"
53
+ @click="resetForm()"
54
+ value="Reset"
55
+ class="btn btn-outline-secondary btn-space"
56
+ />
57
+ </span>
58
+ </div>
59
+ </div>
60
+ </form>
61
+ </template>
62
+
63
+ <script>
64
+ import AdminConfig from "@hashtagcms/helpers/admin-config";
65
+
66
+ export default {
67
+ mounted() {
68
+ this.init();
69
+ },
70
+ props: [
71
+ "dataSelectedParams",
72
+ "dataControllerName",
73
+ "dataFields",
74
+ "dataActionFields",
75
+ ],
76
+ data() {
77
+ return {
78
+ searchParams: { q: "", f: "id", o: "=" },
79
+ actionUrl: AdminConfig.admin_path(this.dataControllerName + "/search"),
80
+ searchFields:
81
+ this.dataFields && this.dataFields != "null"
82
+ ? JSON.parse(this.dataFields)
83
+ : [],
84
+ operators: ["=", "!=", ">", "<", ">=", "<=", "like%", "%like%"],
85
+ hasAction:
86
+ this.dataActionFields && this.dataActionFields != "null"
87
+ ? JSON.parse(this.dataActionFields).length > 0
88
+ : false,
89
+ defaultSearchParams: { q: "", f: "id", o: "=" },
90
+ inputType: "text",
91
+ };
92
+ },
93
+ methods: {
94
+ searchNow() {
95
+ var url;
96
+ if (this.searchParams.q.trim() == "") {
97
+ url = AdminConfig.admin_path(this.dataControllerName);
98
+ } else {
99
+ var q = encodeURI(JSON.stringify(this.searchParams));
100
+ var sep = this.actionUrl.indexOf("?") == -1 ? "?" : "&";
101
+ url = this.actionUrl + sep + "q=" + q;
102
+ }
103
+
104
+ window.location.href = url;
105
+
106
+ return false;
107
+ },
108
+ resetForm() {
109
+ var url = AdminConfig.admin_path(this.dataControllerName);
110
+ //alert(url);
111
+ window.location.href = url;
112
+ },
113
+ getFieldName(key, prop) {
114
+ prop = prop ? prop : "label";
115
+ return typeof key == "string"
116
+ ? key
117
+ : key[prop] == undefined
118
+ ? key
119
+ : key[prop];
120
+ },
121
+ changeInputText() {
122
+ if (
123
+ this.searchParams.f.endsWith("_date") ||
124
+ this.searchParams.f.endsWith("_at")
125
+ ) {
126
+ this.inputType = "date";
127
+ } else {
128
+ this.inputType = "text";
129
+ }
130
+ },
131
+ init() {
132
+ if (this.hasAction) {
133
+ this.searchFields.pop();
134
+ }
135
+
136
+ this.searchParams = JSON.parse(this.dataSelectedParams);
137
+
138
+ if (this.searchParams.f == undefined) {
139
+ this.searchParams = this.defaultSearchParams;
140
+ }
141
+ },
142
+ },
143
+ };
144
+ </script>
@@ -0,0 +1,42 @@
1
+ <template>
2
+ <div>
3
+ <select :name="name" :id="id" @change="setSite" v-model="selected">
4
+ <option value="">Select Site</option>
5
+ <option v-for="site in sites" :value="site.id">
6
+ {{ site.name }}
7
+ </option>
8
+ </select>
9
+ </div>
10
+ </template>
11
+
12
+ <script>
13
+ import SplitButton from "./library/split-button.vue";
14
+ import { EventBus } from "@hashtagcms/helpers/event-bus";
15
+
16
+ export default {
17
+ components: {
18
+ "split-button": SplitButton,
19
+ },
20
+ props: ["dataName", "dataId", "dataSites", "dataSelected"],
21
+ mounted() {
22
+ //this.init();
23
+ },
24
+ data() {
25
+ return {
26
+ sites:
27
+ typeof this.dataSites === "undefined" ? [] : JSON.parse(this.dataSites),
28
+ selected:
29
+ typeof this.dataSelected === "undefined"
30
+ ? 1
31
+ : parseInt(this.dataSelected),
32
+ name: typeof this.dataName === "undefined" ? "site_id" : this.dataName,
33
+ id: typeof this.dataId === "undefined" ? "site_id" : this.dataId,
34
+ };
35
+ },
36
+ methods: {
37
+ setSite() {
38
+ EventBus.$emit("site_changed", this.selected);
39
+ },
40
+ },
41
+ };
42
+ </script>
@@ -0,0 +1,150 @@
1
+ <template>
2
+ <div>
3
+ <div class="row">
4
+ <div class="form-group">
5
+ <div class="col-sm-2">Copy From:</div>
6
+ <div class="col-sm-4">
7
+ <select class="form-select" v-model="sourceSiteId">
8
+ <option value="">Select Site</option>
9
+ <option v-for="site in allSites" :value="site.id">
10
+ {{ getLabel(site) }}
11
+ </option>
12
+ </select>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ <div class="row margin-top-20">
17
+ <div class="form-group">
18
+ <div class="col-sm-2">Copy To:</div>
19
+ <div class="col-sm-4">
20
+ <select class="form-select" v-model="targetSiteId">
21
+ <option value="">Select Site</option>
22
+ <option v-for="site in allSites" :value="site.id">
23
+ {{ getLabel(site) }}
24
+ </option>
25
+ </select>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ <div class="row margin-top-20">
30
+ <div class="form-group">
31
+ <div class="col-sm-2">&nbsp;</div>
32
+ <div class="col-sm-4">
33
+ <div
34
+ v-show="errorMsg != '' && !isLoading"
35
+ class="alert alert-danger text-center"
36
+ >
37
+ {{ errorMessage }}
38
+ </div>
39
+ <div v-show="isLoading == 1" class="alert alert-info text-center">
40
+ <span class="fa fa-spinner fa-pulse fa-fw">&nbsp;</span>&nbsp;Please
41
+ wait and don't close this window. It's not running in thread :)
42
+ </div>
43
+ <div v-show="isLoading > 1" class="alert alert-info">
44
+ <ul>
45
+ <li v-for="msg in successMsg">
46
+ <span :class="msg.success === false ? 'text-danger' : ''">
47
+ {{ msg.message }}
48
+ </span>
49
+ </li>
50
+ </ul>
51
+ </div>
52
+ <input
53
+ @click="doAction()"
54
+ type="button"
55
+ name="submit"
56
+ value="Copy Now!"
57
+ class="btn btn-block btn-success"
58
+ />
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ </template>
64
+
65
+ <script>
66
+ import AdminConfig from "@hashtagcms/helpers/admin-config";
67
+
68
+ import { Toast } from "@hashtagcms/helpers/common";
69
+
70
+ export default {
71
+ mounted() {
72
+ //console.log(this.allData);
73
+ // console.log(this.allData.data[0]);
74
+ //console.log(this.cuurent);
75
+ // this.initData();
76
+ },
77
+ created() {
78
+ //this.initData();
79
+ },
80
+
81
+ props: ["dataAllSites"],
82
+ data() {
83
+ return {
84
+ allSites:
85
+ typeof this.dataAllSites === "undefined"
86
+ ? []
87
+ : JSON.parse(this.dataAllSites),
88
+ sourceSiteId: "",
89
+ targetSiteId: "",
90
+ isLoading: false,
91
+ errorMsg: "",
92
+ successMsg: [],
93
+ };
94
+ },
95
+ computed: {
96
+ errorMessage() {
97
+ return this.errorMsg === ""
98
+ ? "It's undoable. Please be careful."
99
+ : this.errorMsg;
100
+ },
101
+ },
102
+ methods: {
103
+ getLabel(data) {
104
+ var label = "";
105
+ if (data.name || data.alias) {
106
+ label = data.name || data.alias;
107
+ } else if (data.lang) {
108
+ label = typeof data.lang.name == "undefined" ? "" : data.lang.name;
109
+ }
110
+ return label;
111
+ },
112
+ loading(isLoading) {
113
+ this.isLoading = isLoading;
114
+ },
115
+ cloneSite() {
116
+ console.log("copying now...");
117
+ //console.log(allData, seletedData, ids);
118
+ //get all from
119
+ this.loading(1);
120
+ let $this = this;
121
+ let postData = {
122
+ sourceSiteId: this.sourceSiteId,
123
+ tagetSiteId: this.targetSiteId,
124
+ };
125
+
126
+ let url = AdminConfig.admin_path("site/cloneSite");
127
+ axios
128
+ .post(url, postData)
129
+ .then((response) => {
130
+ console.log(response);
131
+ feedback(response);
132
+ this.loading(2);
133
+ })
134
+ .catch((error) => {
135
+ console.log("Error: ", error.response);
136
+ $this.errorMsg = error.response.data.message;
137
+ this.loading(0);
138
+ });
139
+
140
+ function feedback(response) {
141
+ let data = response.data;
142
+ $this.successMsg = data;
143
+ }
144
+ },
145
+ doAction() {
146
+ this.cloneSite();
147
+ },
148
+ },
149
+ };
150
+ </script>
@@ -0,0 +1,234 @@
1
+ <template>
2
+ <div class="col mt-2">
3
+ <div class="mb-2">
4
+ Copy From:
5
+ <select
6
+ class="form-select inline width-auto"
7
+ @change="getBySite()"
8
+ v-model="currentSite"
9
+ >
10
+ <option value="">Select Site</option>
11
+ <option v-for="site in allSites" :value="site.id">
12
+ {{ getLabel(site) }}
13
+ </option>
14
+ </select>
15
+ </div>
16
+ </div>
17
+ <div class="row">
18
+ <site-wise
19
+ ref="siteWiseComponent"
20
+ :data-message="dataMessage"
21
+ :data-site-data="JSON.stringify(siteData)"
22
+ :data-all-data="JSON.stringify(allData)"
23
+ :data-current-key="currentKey"
24
+ :data-site-id="siteId"
25
+ :data-default-action-for-save="doAction"
26
+ :data-alert-css="dataAlertCss"
27
+ >
28
+ </site-wise>
29
+ </div>
30
+ </template>
31
+
32
+ <script>
33
+ import AdminConfig from "@hashtagcms/helpers/admin-config";
34
+
35
+ import { Toast, Loader } from "@hashtagcms/helpers/common";
36
+ import SiteWiseData from "./sitewise-data.vue";
37
+
38
+ export default {
39
+ mounted() {
40
+ //console.log(this.allData);
41
+ // console.log(this.allData.data[0]);
42
+ //console.log(this.cuurent);
43
+ // this.initData();
44
+ },
45
+ components: {
46
+ "site-wise": SiteWiseData,
47
+ },
48
+ created() {
49
+ //this.initData();
50
+ },
51
+
52
+ props: [
53
+ "dataAllSites",
54
+ "dataMessage",
55
+ "dataAllData",
56
+ "dataSiteData",
57
+ "dataCurrentKey",
58
+ "dataSiteId",
59
+ "dataAlertCss",
60
+ "dataControllerName",
61
+ ],
62
+ data() {
63
+ return {
64
+ allSites:
65
+ typeof this.dataAllSites === "undefined"
66
+ ? []
67
+ : JSON.parse(this.dataAllSites),
68
+ siteData:
69
+ typeof this.dataSiteData == "undefined" || this.dataSiteData === ""
70
+ ? []
71
+ : JSON.parse(this.dataSiteData),
72
+ allData:
73
+ typeof this.dataAllData == "undefined" || this.dataAllData === ""
74
+ ? []
75
+ : JSON.parse(this.dataAllData),
76
+ currentKey: this.dataCurrentKey,
77
+ searchKey: "",
78
+ siteId: parseInt(this.dataSiteId),
79
+ currentSite: "",
80
+ controllerName:
81
+ typeof this.dataControllerName === "undefined"
82
+ ? "site"
83
+ : this.dataControllerName,
84
+ };
85
+ },
86
+ methods: {
87
+ showHdeLoader: function (show) {
88
+ if (show) {
89
+ Loader.show(this, "Please wait...");
90
+ } else {
91
+ Loader.hide(this);
92
+ }
93
+ },
94
+ saveNow(url, data) {
95
+ return new Promise((resolve, reject) => {
96
+ axios
97
+ .post(url, data)
98
+ .then((response) => {
99
+ resolve(response);
100
+ })
101
+ .catch((error) => {
102
+ reject(error.response);
103
+ });
104
+ });
105
+ },
106
+ getLabel(data) {
107
+ let label = "";
108
+ if (data.name || data.alias) {
109
+ label = data.name || data.alias;
110
+ } else if (data.lang) {
111
+ label = typeof data.lang.name == "undefined" ? "" : data.lang.name;
112
+ }
113
+ return label;
114
+ },
115
+ populateData(data) {
116
+ this.allData = data;
117
+ //console.log("this.$refs.siteWiseComponent ",this.$refs.siteWiseComponent);
118
+ this.$refs.siteWiseComponent.setData("data", data);
119
+ },
120
+ getBySite() {
121
+ if (this.currentSite !== "") {
122
+ let what = this.currentKey;
123
+ let url = AdminConfig.admin_path(
124
+ this.controllerName + "/getBySite/" + this.currentSite + "/" + what,
125
+ );
126
+ this.showHdeLoader(true);
127
+ axios
128
+ .get(url)
129
+ .then((response) => {
130
+ this.populateData(response.data);
131
+ })
132
+ .catch((response) => {
133
+ console.log(response);
134
+ })
135
+ .finally(() => {
136
+ this.showHdeLoader(false);
137
+ });
138
+ } else {
139
+ this.populateData([]);
140
+ }
141
+ },
142
+ actionAdd(allData, seletedData, ids) {
143
+ console.log("copying now...");
144
+ //console.log(allData, seletedData, ids);
145
+ //get all from
146
+ let $this = this;
147
+ let postData = {
148
+ fromSite: {
149
+ site_id: this.currentSite,
150
+ data: seletedData,
151
+ },
152
+ toSite: { site_id: this.siteId },
153
+ type: this.currentKey,
154
+ };
155
+ this.showHdeLoader(true);
156
+ let url = AdminConfig.admin_path(this.controllerName + "/copySettings");
157
+ axios
158
+ .post(url, postData)
159
+ .then((response) => {
160
+ console.log(response);
161
+ feedback(response);
162
+ })
163
+ .catch((response) => {
164
+ console.log(response);
165
+ })
166
+ .finally(() => {
167
+ this.showHdeLoader(false);
168
+ });
169
+
170
+ function feedback(response) {
171
+ let data = response.data;
172
+ //console.log("data.inserted ",data.inserted);
173
+ if (data.inserted === false) {
174
+ Toast.show($this, data.message || "Nothing happened.", 5000);
175
+ } else {
176
+ let ignored = data.ignored;
177
+ let copied = data.copied;
178
+ $this.$refs.siteWiseComponent.setSiteData(data.siteData);
179
+
180
+ //Showing some manners - giving feedback
181
+ let msg = `${copied.length} Copied and ${ignored.length} ignored. Open console for details`;
182
+ Toast.show($this, msg, 7000);
183
+ console.info("Copied: ", copied);
184
+ console.info("Ignored: ", ignored);
185
+ }
186
+ }
187
+ },
188
+ actionRemove(allData, seletedData, ids) {
189
+ let site_id = seletedData.length > 0 ? seletedData[0].site_id : null;
190
+
191
+ if (site_id === null) {
192
+ return false;
193
+ }
194
+
195
+ let $this = this;
196
+ let postData = {
197
+ site_id: site_id,
198
+ ids: ids,
199
+ type: this.currentKey,
200
+ };
201
+
202
+ let url = AdminConfig.admin_path(this.controllerName + "/removeSettings");
203
+ this.showHdeLoader(true);
204
+ axios
205
+ .post(url, postData)
206
+ .then((response) => {
207
+ feedback(response);
208
+ })
209
+ .catch((response) => {
210
+ console.log(response);
211
+ })
212
+ .finally(() => {
213
+ this.showHdeLoader(false);
214
+ });
215
+
216
+ function feedback(response) {
217
+ //console.log(response);
218
+ let data = response.data;
219
+ if (data.deleted === 0) {
220
+ Toast.show($this, "Sorry!, Somehow it's not deleted.", 5000);
221
+ }
222
+ $this.$refs.siteWiseComponent.setSiteData(data.siteData);
223
+ }
224
+ },
225
+ doAction(action, allData, seletedData, ids) {
226
+ if (action === "add") {
227
+ this.actionAdd(allData, seletedData, ids);
228
+ } else {
229
+ this.actionRemove(allData, seletedData, ids);
230
+ }
231
+ },
232
+ },
233
+ };
234
+ </script>