free-fe-core-modules 0.0.1

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 (112) hide show
  1. package/README.md +7 -0
  2. package/components/.gitkeep +0 -0
  3. package/components/Basic/BreadCrumbs.vue +87 -0
  4. package/components/Basic/EIcon.vue +84 -0
  5. package/components/Basic/LeveledMenus.vue +92 -0
  6. package/components/Basic/SummaryHead.vue +312 -0
  7. package/components/Dialog/BasicDialog.vue +442 -0
  8. package/components/Dialog/index.js +38 -0
  9. package/components/Dialog/index1.js +49 -0
  10. package/components/FloatingWindow/index.vue +140 -0
  11. package/components/SelectLocales/index.vue +47 -0
  12. package/components/SlidingCarousel/index.vue +86 -0
  13. package/components/SlidingNews/index.vue +138 -0
  14. package/components/StickyButtons/index.vue +98 -0
  15. package/components/ThemeSwitch/index.vue +77 -0
  16. package/field-components/Display/index.js +3 -0
  17. package/field-components/Fields/AgreementCheck.vue +161 -0
  18. package/field-components/Fields/ApiCall.vue +139 -0
  19. package/field-components/Fields/Boolean.vue +112 -0
  20. package/field-components/Fields/Category.vue +33 -0
  21. package/field-components/Fields/Check.vue +131 -0
  22. package/field-components/Fields/Customize.vue +103 -0
  23. package/field-components/Fields/Date.vue +142 -0
  24. package/field-components/Fields/DateRange.vue +199 -0
  25. package/field-components/Fields/DynamicList.vue +575 -0
  26. package/field-components/Fields/FieldEditor.vue +379 -0
  27. package/field-components/Fields/File.vue +382 -0
  28. package/field-components/Fields/FileList.vue +405 -0
  29. package/field-components/Fields/FileListCombined.vue +142 -0
  30. package/field-components/Fields/FixedList.vue +372 -0
  31. package/field-components/Fields/Image.vue +328 -0
  32. package/field-components/Fields/ImageList.vue +285 -0
  33. package/field-components/Fields/ImageListCombined.vue +76 -0
  34. package/field-components/Fields/InputFieldList.vue +299 -0
  35. package/field-components/Fields/Labels.vue +182 -0
  36. package/field-components/Fields/MixedTable.vue +367 -0
  37. package/field-components/Fields/Number.vue +247 -0
  38. package/field-components/Fields/Password.vue +79 -0
  39. package/field-components/Fields/Permission.vue +83 -0
  40. package/field-components/Fields/PermissionEditor.vue +205 -0
  41. package/field-components/Fields/QueryFilters.vue +162 -0
  42. package/field-components/Fields/RadioList.vue +81 -0
  43. package/field-components/Fields/Rich.vue +369 -0
  44. package/field-components/Fields/Search.vue +499 -0
  45. package/field-components/Fields/Select.vue +376 -0
  46. package/field-components/Fields/SelectionChain.vue +198 -0
  47. package/field-components/Fields/Separator.vue +26 -0
  48. package/field-components/Fields/SingleList.vue +125 -0
  49. package/field-components/Fields/Static.vue +22 -0
  50. package/field-components/Fields/String.vue +185 -0
  51. package/field-components/Fields/Text.vue +89 -0
  52. package/field-components/Fields/Time.vue +160 -0
  53. package/field-components/Fields/TimeRange.vue +348 -0
  54. package/field-components/Fields/UltimateFile.vue +100 -0
  55. package/field-components/Fields/Year.vue +124 -0
  56. package/field-components/Fields/YearRange.vue +188 -0
  57. package/field-components/Fields/components/FieldTypeOptions.vue +248 -0
  58. package/field-components/Fields/index.js +117 -0
  59. package/field-components/components/FieldComponents.vue +246 -0
  60. package/field-components/index.js +13 -0
  61. package/field-components/style.sass +11 -0
  62. package/free-fields/AutoHide.js +66 -0
  63. package/free-fields/CenterContent.js +15 -0
  64. package/free-fields/Draggable.js +30 -0
  65. package/free-fields/Droppable.js +114 -0
  66. package/free-fields/EditableString.js +63 -0
  67. package/free-fields/FieldCategory.js +83 -0
  68. package/free-fields/FieldTypeSelect.js +94 -0
  69. package/free-fields/fieldEditors/arrayEditor.js +3 -0
  70. package/free-fields/fieldEditors/boolEditor.js +22 -0
  71. package/free-fields/fieldEditors/dateEditor.js +23 -0
  72. package/free-fields/fieldEditors/datetimeEditor.js +23 -0
  73. package/free-fields/fieldEditors/index.js +21 -0
  74. package/free-fields/fieldEditors/jsonEditor.js +371 -0
  75. package/free-fields/fieldEditors/labeledField.js +74 -0
  76. package/free-fields/fieldEditors/numberEditor.js +51 -0
  77. package/free-fields/fieldEditors/objectEditor.js +3 -0
  78. package/free-fields/fieldEditors/selectEditor.js +0 -0
  79. package/free-fields/fieldEditors/stringEditor.js +49 -0
  80. package/free-fields/fieldEditors/textEditor.js +50 -0
  81. package/free-fields/fieldEditors/timeEditor.js +23 -0
  82. package/free-fields/index.js +402 -0
  83. package/i18n/en-us/index.js +73 -0
  84. package/i18n/fields/en-us/index.js +9 -0
  85. package/i18n/fields/zh-cn/index.js +9 -0
  86. package/i18n/zh-cn/index.js +73 -0
  87. package/index.js +367 -0
  88. package/package.json +11 -0
  89. package/router/dict/api.js +18 -0
  90. package/router/dict/data.js +48 -0
  91. package/router/dict/index.js +7 -0
  92. package/router/error/api.js +14 -0
  93. package/router/error/data.js +33 -0
  94. package/router/error/index.js +9 -0
  95. package/router/index.js +13 -0
  96. package/router/menu/api.js +24 -0
  97. package/router/menu/data.js +85 -0
  98. package/router/menu/index.js +7 -0
  99. package/router/system/api.js +10 -0
  100. package/router/system/data.js +46 -0
  101. package/router/system/index.js +7 -0
  102. package/stores/index.js +17 -0
  103. package/stores/module-mourning/actions.js +3 -0
  104. package/stores/module-mourning/getters.js +1 -0
  105. package/stores/module-mourning/index.js +11 -0
  106. package/stores/module-mourning/state.js +3 -0
  107. package/stores/mourning.js +3 -0
  108. package/view/dict/index.vue +284 -0
  109. package/view/error/list.vue +197 -0
  110. package/view/menu/index.vue +332 -0
  111. package/view/mourning/mourning.vue +45 -0
  112. package/view/system/index.vue +149 -0
@@ -0,0 +1,46 @@
1
+ // import Vue from 'vue';
2
+ import { getConfig } from './api';
3
+
4
+ // const bus = new Vue();
5
+
6
+ export default {
7
+ systemConfig: () => ({
8
+ GetData: (o) => getConfig(o).then((d) => {
9
+ const data = (d && d.data) ? d.data : {};
10
+
11
+ data.StepsDefinition = [];
12
+ data.docs = data.docs || [];
13
+ for (let i = 0; i < data.docs.length; i += 1) {
14
+ const doc = data.docs[i];
15
+
16
+ doc.Type = 'String';
17
+ doc.Label = doc.Name;
18
+ doc.Name = 'Value';
19
+
20
+ const def = data.StepsDefinition.find((df) => !!df && df.Name === doc.Category);
21
+ if (def) {
22
+ def.Fields = def.Fields || [];
23
+ def.Fields.push({ ...doc, ...doc.Field || {} });
24
+ delete doc.Field;
25
+ } else {
26
+ data.StepsDefinition.push({
27
+ Name: doc.Category,
28
+ Index: i + 1,
29
+ Actions: [
30
+ {
31
+ Label: '保存',
32
+ Action: 'save',
33
+ },
34
+ ],
35
+ Fields: [doc],
36
+ });
37
+ }
38
+ }
39
+
40
+ data.StepsDefinition.forEach((sd) => sd.Fields.sort((a, b) => a.Index - b.Index));
41
+
42
+ return data;
43
+ }),
44
+ // Bus: bus,
45
+ }),
46
+ };
@@ -0,0 +1,7 @@
1
+ import data from './data';
2
+
3
+ export default [{
4
+ path: 'system',
5
+ component: () => import('../../view/system/index.vue'),
6
+ props: data.systemConfig,
7
+ }];
@@ -0,0 +1,17 @@
1
+ import { store } from 'quasar/wrappers'
2
+ import { createPinia } from 'pinia'
3
+
4
+ /*
5
+ * If not building with SSR mode, you can
6
+ * directly export the Store instantiation;
7
+ *
8
+ * The function below can be async too; either use
9
+ * async/await or return a Promise which resolves
10
+ * with the Store instance.
11
+ */
12
+
13
+ export default store(function (/* { ssrContext } */) {
14
+ const Store = createPinia();
15
+
16
+ return Store
17
+ })
@@ -0,0 +1,3 @@
1
+ export default {
2
+
3
+ }
@@ -0,0 +1 @@
1
+ export default {}
@@ -0,0 +1,11 @@
1
+ import { defineStore } from 'pinia';
2
+
3
+ import state from './state';
4
+ import getters from './getters';
5
+ import actions from './actions';
6
+
7
+ export default defineStore('mourning', {
8
+ getters,
9
+ actions,
10
+ state,
11
+ });
@@ -0,0 +1,3 @@
1
+ export default () => ({
2
+ mourning: false,
3
+ })
@@ -0,0 +1,3 @@
1
+ import useMourningStore from './module-mourning';
2
+
3
+ export default useMourningStore;
@@ -0,0 +1,284 @@
1
+ <template>
2
+ <div class="admin-dictionary-mgmt-wrapper full-height q-pa-md">
3
+ <q-tree
4
+ :nodes="(data && data.total) ? data.docs : []"
5
+ ref="dictTree"
6
+ accordion
7
+ no-connectors
8
+ node-key="id"
9
+ label-key="Label"
10
+ @lazy-load="loadSubDicts"
11
+ @update:expanded="onNodeExpanded"
12
+ >
13
+ <template v-slot:default-header="prop">
14
+ <div
15
+ class="dictionary-head row items-center full-width"
16
+ style="border-bottom: solid 1px grey;"
17
+ >
18
+ <div>
19
+ {{ prop.node.Label }}
20
+ <span
21
+ v-if="prop.node.level === 1 && prop.node.Name"
22
+ class="dictionary-data-name"
23
+ >({{prop.node.Name}})</span>
24
+ <div
25
+ v-if="prop.node.Description"
26
+ caption
27
+ class="description ellipsis-3-lines"
28
+ v-html="prop.node.Description"
29
+ ></div>
30
+ </div>
31
+ <q-space></q-space>
32
+
33
+ <span class="flex justify-start action-buttons">
34
+ <q-btn v-if="prop.node.addingNew" flat icon="add"
35
+ @click.stop="addNode(prop.node)"></q-btn>
36
+ <q-btn v-if="!prop.node.addingNew" flat icon="edit"
37
+ @click.stop="editNode(prop.node)"></q-btn>
38
+ <q-btn
39
+ v-if="!prop.node.addingNew"
40
+ :disabled="prop.node.BuiltIn"
41
+ flat
42
+ icon="delete"
43
+ @click.stop="deleteNode(prop.node)"
44
+ ></q-btn>
45
+ </span>
46
+ </div>
47
+ </template>
48
+
49
+ <template v-slot:default-body="prop">
50
+ <div v-if="prop.node.id === selectedDictNode.id" class="full-width">
51
+ <div v-for="(field, fIndex) in dictFields || []" :key="fIndex">
52
+ <free-field
53
+ v-if="field.Name !== 'Name' || !selectedDictNode.Parent"
54
+ :values="editingDict"
55
+ :Field="field"
56
+ ></free-field>
57
+ </div>
58
+
59
+ <div class="action-btns full-width row justify-center q-gutter-md">
60
+ <q-btn :label="$t('saveButtonText')" class="btn-primary" @click="onSaveClick" />
61
+ <q-btn :label="$t('cancelButtonText')" class="btn-secondary" @click="onCancelClick" />
62
+ </div>
63
+
64
+ <sticky-buttons
65
+ :actions="[
66
+ {
67
+ Action: 'cancel',
68
+ icon:'cancel',
69
+ Label: $t('cancelButtonText')
70
+ },{
71
+ Action: 'save',
72
+ icon: 'save',
73
+ Label:$t('saveButtonText')
74
+ }
75
+ ]"
76
+ @click="stickyButtonClicked"
77
+ ></sticky-buttons>
78
+ </div>
79
+ </template>
80
+ </q-tree>
81
+ </div>
82
+ </template>
83
+
84
+ <script>
85
+ import mixins from 'free-fe-mixins';
86
+ import { defineComponent } from 'vue';
87
+
88
+ export default defineComponent({
89
+ name: 'DictionaryPage',
90
+ mixins: [mixins.ObjectDataMixin],
91
+ props: {
92
+ addDict: { type: Function, default: () => {} },
93
+ editDict: { type: Function, default: () => {} },
94
+ deleteDict: { type: Function, default: () => {} },
95
+ },
96
+ data() {
97
+ return {
98
+ selectedDictNode: {},
99
+ editingDict: {},
100
+ dictFields: [],
101
+ };
102
+ },
103
+ watch: {
104
+ // eslint-disable-next-line func-names
105
+ 'editingDict.Type': function (v) {
106
+ const valueField = this.dictFields.find((f) => f.Name === 'Value');
107
+ if (valueField) {
108
+ if (v === 'File') {
109
+ valueField.Type = 'File';
110
+ } else {
111
+ valueField.Type = 'String';
112
+ }
113
+ }
114
+ },
115
+ },
116
+ created() {
117
+ this.dictFields = this.getModule('core-modules').config.dictFields;
118
+ },
119
+ methods: {
120
+ loadSubDicts({ key, done, node /* , fail */ }) {
121
+ this.GetData(key, node.level)
122
+ .then((d) => {
123
+ if (!d || !d.total || !d.docs) done([]);
124
+ else {
125
+ done(d.docs);
126
+ }
127
+ })
128
+ .catch(() => {
129
+ done([]);
130
+ });
131
+ },
132
+ addNode(n) {
133
+ if (this.selectedDictNode && this.selectedDictNode.id === n.id) {
134
+ this.selectedDictNode = {};
135
+ this.editingDict = {};
136
+ this.$refs.dictTree.setExpanded(n.id, false);
137
+ } else {
138
+ this.selectedDictNode = n;
139
+ this.editingDict = {
140
+ Type: 'String',
141
+ };
142
+ }
143
+ },
144
+ editNode(n) {
145
+ if (this.selectedDictNode && this.selectedDictNode.id === n.id) {
146
+ this.selectedDictNode = {};
147
+ this.editingDict = {};
148
+ this.$refs.dictTree.setExpanded(n.id, false);
149
+ } else {
150
+ this.selectedDictNode = n;
151
+ this.editingDict = { ...n };
152
+ this.$refs.dictTree.setExpanded(n.id, true);
153
+ }
154
+ },
155
+ deleteNode(n) {
156
+ if (n.addingNew || !n.id) return;
157
+
158
+ this.$MsgDialog({
159
+ type: '',
160
+ content: `确认要删除字典项 '${n.Name}' 吗?`,
161
+ canCancel: true,
162
+ okText: this.$t('okButtonText'),
163
+ cancelText: this.$t('cancelButtonText'),
164
+ })
165
+ .then(() => {
166
+ this.deleteDict(n.id).then((d) => {
167
+ if (d && d.msg === 'OK') {
168
+ this.refreshData();
169
+ }
170
+ });
171
+ })
172
+ .catch(() => {});
173
+ },
174
+ onSaveClick() {
175
+ if (Object.keys(this.editingDict) <= 0) return;
176
+ // if is adding new
177
+ if (this.selectedDictNode.addingNew) {
178
+ this.editingDict = {
179
+ lazy: true,
180
+ Parent: this.selectedDictNode.Parent,
181
+ level: this.selectedDictNode.level,
182
+ ...this.editingDict,
183
+ };
184
+
185
+ // fix: the default content for number input will be string!!!!????
186
+ // convert to number
187
+ this.editingDict.Index = Number(this.editingDict.Index || '0');
188
+
189
+ this.addDict(this.editingDict).then((r) => {
190
+ if (r && r.msg === 'OK') {
191
+ const parent = this.$refs.dictTree.getNodeByKey(
192
+ this.selectedDictNode.Parent,
193
+ );
194
+ if (parent) {
195
+ parent.children.push(
196
+ { id: r.data.id, ...this.editingDict },
197
+ );
198
+ parent.children = parent.children.sort(
199
+ (a, b) => (a ? a.Index : 0) - (b ? b.Index : 0),
200
+ );
201
+ } else {
202
+ this.data.docs.push(
203
+ { id: r.data.id, ...this.editingDict },
204
+ );
205
+ this.data.docs = this.data.docs.sort(
206
+ (a, b) => (a ? a.Index : 0) - (b ? b.Index : 0),
207
+ );
208
+ }
209
+ } else {
210
+ this.$q.notify((r && r.msg) || this.$t('notifyAddFailed'));
211
+ }
212
+
213
+ this.editingDict = {};
214
+ this.selectedDictNode = {};
215
+ });
216
+ } else {
217
+ // editing
218
+ const updatingDict = { ...this.editingDict };
219
+ delete updatingDict.children;
220
+ delete updatingDict.level;
221
+ delete updatingDict.lazy;
222
+ this.editDict(updatingDict).then((r) => {
223
+ if (r && r.msg === 'OK') {
224
+ let currentNode = this.$refs.dictTree.getNodeByKey(
225
+ this.editingDict.id,
226
+ );
227
+ if (currentNode) {
228
+ currentNode = Object.assign(currentNode, this.editingDict);
229
+ }
230
+
231
+ // order
232
+ const parent = this.$refs.dictTree.getNodeByKey(
233
+ this.selectedDictNode.Parent,
234
+ );
235
+ if (parent) {
236
+ parent.children = parent.children.sort(
237
+ (a, b) => (a ? a.Index : 0) - (b ? b.Index : 0),
238
+ );
239
+ } else {
240
+ this.data.docs = this.data.docs.sort(
241
+ (a, b) => (a ? a.Index : 0) - (b ? b.Index : 0),
242
+ );
243
+ }
244
+ }
245
+
246
+ this.editingDict = {};
247
+ this.selectedDictNode = {};
248
+ });
249
+ }
250
+ },
251
+ onCancelClick() {
252
+ this.editingDict = {};
253
+ this.selectedDictNode = {};
254
+ },
255
+ onNodeExpanded() {
256
+ this.editingDict = {};
257
+ this.selectedDictNode = {};
258
+ },
259
+ stickyButtonClicked(a) {
260
+ if (!a || !a.Action) return;
261
+
262
+ if (a.Action === 'save') {
263
+ this.onSaveClick();
264
+ } else if (a.Action === 'cancel') {
265
+ this.onCancelClick();
266
+ }
267
+ },
268
+ },
269
+ });
270
+ </script>
271
+
272
+ <style lang="sass" scoped>
273
+ .admin-dictionary-mgmt-wrapper
274
+ background: $background
275
+ .dictionary-head
276
+ .description
277
+ max-width: 680px
278
+ font-size: 12px
279
+ font-weight: 400
280
+ color: $grey-7
281
+ .dictionary-data-name
282
+ font-size: 14px
283
+ font-weight: normal
284
+ </style>
@@ -0,0 +1,197 @@
1
+ <template>
2
+ <div class="flow-list">
3
+ <summary-head :values="data.summary" :Bus="Bus"></summary-head>
4
+ <q-table
5
+ :rows="data ? data.docs : []"
6
+ :columns="columns"
7
+ row-key="id"
8
+ :hide-bottom="!pagination"
9
+ :pagination="tablePagination"
10
+ >
11
+ <template v-slot:header-cell-status="props" v-if="data.Filters && data.Filters.length > 0">
12
+ <q-th :props="props" class="filter-header-cell">
13
+ <q-btn flat icon="search" @click="showFilters = !showFilters">查询</q-btn>
14
+ </q-th>
15
+ </template>
16
+
17
+ <template v-slot:body="props">
18
+ <q-tr>
19
+ <q-td v-for="col in props.cols" :key="col.name" :props="props" class="ellipsis">
20
+ <span v-if="col.name === 'index'">{{props.row.index}}</span>
21
+ <span v-else>
22
+ {{ valueFilters(col, col.value || Object.nestValue(props.row, col.field))}}
23
+ <q-popup-edit
24
+ v-model="props.row.Message"
25
+ v-if="col.name === 'message'"
26
+ buttons
27
+ persistent
28
+ label-set="保存"
29
+ label-cancel="取消"
30
+ @save="messageChanged(props.row.id, props.row.Message)"
31
+ >
32
+ <q-input v-model="props.row.Message" hide-bottom-space autofocus />
33
+ </q-popup-edit>
34
+ <q-popup-edit
35
+ v-model="props.row.Description"
36
+ v-if="col.name === 'description'"
37
+ buttons
38
+ persistent
39
+ label-set="保存"
40
+ label-cancel="取消"
41
+ @save="descriptionChanged(props.row.id, props.row.Description)"
42
+ >
43
+ <q-input v-model="props.row.Description" hide-bottom-space autofocus />
44
+ </q-popup-edit>
45
+ </span>
46
+ </q-td>
47
+ </q-tr>
48
+ </template>
49
+
50
+ <template v-slot:top-row>
51
+ <q-tr class="persistant-top-row full-width">
52
+ <q-td class="full-width" colspan="100%"></q-td>
53
+ </q-tr>
54
+ <q-tr v-if="showFilters" class="table-row filter-row">
55
+ <q-td colspan="100%" class="table-cell filter-cell">
56
+ <free-field
57
+ :Field="{Type: 'QueryFilters', Name: 'Filters'}"
58
+ :values="data"
59
+ @search="querySearch"
60
+ ></free-field>
61
+ </q-td>
62
+ </q-tr>
63
+ </template>
64
+
65
+ <template v-slot:no-data>
66
+ <div class="full-width full-height row flex-center q-gutter-sm">
67
+ <span>暂 无 数 据</span>
68
+ </div>
69
+ </template>
70
+
71
+ <template v-slot:bottom>
72
+ <div v-if="pagination" class="full-width row flex-center">
73
+ 共{{data.total}}条
74
+ <q-pagination
75
+ v-model="data.page"
76
+ :max="data.pages"
77
+ @input="paginationChanged"
78
+ boundary-links
79
+ boundary-numbers
80
+ direction-links
81
+ :max-pages="6"
82
+ ></q-pagination>
83
+ </div>
84
+ </template>
85
+ </q-table>
86
+ </div>
87
+ </template>
88
+
89
+ <script>
90
+ import mixins from 'free-fe-mixins';
91
+ import { updateErrorCode, updateDescription } from '../../router/error/api';
92
+ import { defineComponent } from 'vue';
93
+
94
+ export default defineComponent({
95
+ name: 'ErrorCodeList',
96
+ mixins: [mixins.ObjectDataMixin],
97
+ props: {
98
+ pagination: { type: Boolean, default: true },
99
+ },
100
+ data() {
101
+ return {
102
+ queryFilter: {},
103
+ showFilters: false,
104
+ tablePagination: {
105
+ rowsPerPage: this.data && this.data.limit ? this.data.limit : 8,
106
+ rowsNumber: this.data && this.data.total ? this.data.total : 0,
107
+ },
108
+ columns: [
109
+ {
110
+ name: 'index',
111
+ label: '#',
112
+ field: 'index',
113
+ },
114
+ {
115
+ name: 'date',
116
+ label: '日期',
117
+ field: 'LastUpdateDate',
118
+ filters: 'normalDate',
119
+ style: 'max-width: 200px;',
120
+ },
121
+ {
122
+ name: 'code',
123
+ label: '代码',
124
+ field: 'Code',
125
+ style: 'max-width: 120px;',
126
+ },
127
+ {
128
+ name: 'message',
129
+ label: '信息',
130
+ field: 'Message',
131
+ },
132
+ {
133
+ name: 'description',
134
+ label: '描述',
135
+ field: 'Description',
136
+ },
137
+ ],
138
+ };
139
+ },
140
+ computed: {
141
+ valueFilters() {
142
+ return (col, v) => {
143
+ let val = v || col.value;
144
+ if (col.filters) {
145
+ let filters = [];
146
+ if (typeof col.filters === 'string') {
147
+ // only one filter
148
+ filters.push(col.filters);
149
+ } else if (Array.isArray(col.filters)) {
150
+ filters = filters.concat(col.filters);
151
+ }
152
+
153
+ for (let i = 0; i < filters.length; i += 1) {
154
+ const f = filters[i];
155
+ const filter = this.$options.filters[f];
156
+ if (filter) {
157
+ val = filter(v || col.value);
158
+ }
159
+ }
160
+ }
161
+
162
+ return val;
163
+ };
164
+ },
165
+ },
166
+ created() {},
167
+ methods: {
168
+ paginationChanged(p) {
169
+ this.refreshData({ page: p });
170
+ },
171
+ messageChanged(id, msg) {
172
+ updateErrorCode(id, msg).then((d) => {
173
+ if (d && d.msg === 'OK') {
174
+ this.$q.notify(this.$t('notifySaved'));
175
+ } else {
176
+ this.$q.notify(this.$t('notifyChangeFailed'));
177
+ }
178
+ });
179
+ },
180
+ descriptionChanged(id, desc) {
181
+ updateDescription(id, desc).then((d) => {
182
+ if (d && d.msg === 'OK') {
183
+ this.$q.notify(this.$t('notifySaved'));
184
+ } else {
185
+ this.$q.notify(this.$t('notifyChangeFailed'));
186
+ }
187
+ });
188
+ },
189
+ },
190
+ beforeUnmount() {},
191
+ });
192
+ </script>
193
+
194
+ <style lang="sass" scoped>
195
+ .persistant-top-row
196
+ display: none
197
+ </style>