flameresttable 1.0.18 → 1.0.20

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/README.md CHANGED
@@ -12,5 +12,10 @@
12
12
  ### RowSubSlot
13
13
  Это слот для клика по строке таблицы, если включён параметр `opts.onRowClickOpenSlot`
14
14
 
15
+ ### Virtual columns
16
+ Колонки, которые отправляются на сервер в разделе params и не влияют на выдачу, но могут использоваться для кастомной и тонкой фильтрации
17
+
18
+ Добавляются через `opts.addVirtual`
19
+
15
20
  # Licenses
16
21
  MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flameresttable",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "main": "./src/plugin.ts",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "@vuepic/vue-datepicker": "^7.2.0",
19
- "flamerest": "^1.0.92",
19
+ "flamerest": "^1.0.93",
20
20
  "lodash-es": "^4.17.21",
21
21
  "pinia": "^2.1.7",
22
22
  "pug": "github:FlameArt/pug-tailwind-only",
package/src/App.vue CHANGED
@@ -35,6 +35,10 @@ opts.set("name", {
35
35
  },
36
36
  Popup: { isShow: true }
37
37
  });
38
+
39
+
40
+ opts.addVirtual('test', { title: 'test title', Table: { isShow: true, } })
41
+
38
42
  opts.Add.can = true;
39
43
  opts.Remove.can = true;
40
44
 
@@ -1,3 +1,6 @@
1
+ // Подгрузчик типа класса
2
+ type Class<T> = new (...args: any[]) => T
3
+
1
4
  export class Column implements IColumn {
2
5
 
3
6
  /**
@@ -11,6 +14,11 @@ export class Column implements IColumn {
11
14
  */
12
15
  public title: string = "";
13
16
 
17
+ /**
18
+ * Поддержка виртуальных столбцов для кастомных запросов
19
+ */
20
+ public isVirtual: boolean = false;
21
+
14
22
  /**
15
23
  * Параметры таблицы
16
24
  */
@@ -64,6 +72,11 @@ export class Column implements IColumn {
64
72
  */
65
73
  loader: () => [],
66
74
 
75
+ /**
76
+ * Модель, с которой выгружать значения
77
+ */
78
+ model: null as Class<any> | null,
79
+
67
80
  /**
68
81
  * Здесь список готовых значений
69
82
  */
@@ -225,6 +238,10 @@ export interface IColumn {
225
238
  */
226
239
  title?: string,
227
240
 
241
+ /**
242
+ * Поддержка виртуальных столбцов для кастомных запросов
243
+ */
244
+ isVirtual?: boolean,
228
245
 
229
246
  /**
230
247
  * Параметры таблицы
@@ -149,10 +149,18 @@ export default class FlameTable<T> {
149
149
 
150
150
  public applyFiltersParams() {
151
151
  const customFilters: ITableLoadParams = {
152
- where: {}
152
+ where: {},
153
+ params: {}
153
154
  };
154
155
  for (const key in this.columns) {
155
156
  const el = this.columns[key].Filter;
157
+
158
+ // Виртуальные элементы не фильтруем, но добавляем в массив
159
+ if (this.columns[key].isVirtual) {
160
+ customFilters.params[key] = el.valueString;
161
+ continue;
162
+ }
163
+
156
164
  switch (el.type) {
157
165
 
158
166
  // Частичное совпадение
@@ -160,6 +168,7 @@ export default class FlameTable<T> {
160
168
 
161
169
  if (el.valueString.trim() === '') continue;
162
170
  customFilters.where[key] = ['LIKE', key, el.valueString];
171
+
163
172
  break;
164
173
 
165
174
  // Фуллтекстовый поиск
@@ -22,8 +22,9 @@
22
22
 
23
23
  <!-- ЧИСЛО ЗАПИСЕЙ -->
24
24
  <div class="text-xs text-gray-400">
25
- Показано: {{ Table.Pager.total > Table.Pager.perPage * Table.Pager.page ?
26
- Table.Pager.perPage * Table.Pager.page : Table.Pager.total }} / {{ Table.Pager.total }} записей
25
+ {{ opts.lang === 'ru' ? 'Показано:' : 'Show' }} {{ Table.Pager.total > Table.Pager.perPage * Table.Pager.page ?
26
+ Table.Pager.perPage * Table.Pager.page : Table.Pager.total }} / {{ Table.Pager.total }} {{ opts.lang === 'ru' ?
27
+ 'записей' : ' records' }}
27
28
  </div>
28
29
 
29
30
  </div>
@@ -9,6 +9,14 @@
9
9
  <input class="outline-none border border-slate-500 px-2 py-1 mx-2" :placeholder="col.title ?? col.name"
10
10
  type="text" @keyup="update()" v-model="col.Filter.valueString" />
11
11
  </div>
12
+ <div v-if="col.Filter.type === 'selector'">
13
+ <select class="outline-none border border-slate-500 px-2 py-1 mx-2" :placeholder="col.title ?? col.name"
14
+ @change="update()" v-model="col.Filter.valueString">
15
+ <option v-for="item in col.Selector.values" :key="item[0]">
16
+
17
+ </option>
18
+ </select>
19
+ </div>
12
20
  </div>
13
21
 
14
22
  </div>
@@ -5,6 +5,7 @@ export default interface ITableLoadParams {
5
5
  expand?: any,
6
6
  sort?: Array<string>,
7
7
  page?: number,
8
- perPage?: number
8
+ perPage?: number,
9
+ params?: any
9
10
 
10
11
  }
@@ -26,6 +26,22 @@ export default class TableOpts {
26
26
  */
27
27
  public onRowClickOpenSlot: boolean = false;
28
28
 
29
+ /**
30
+ * Язык
31
+ */
32
+ public lang: 'ru' | 'en' = "ru";
33
+
34
+ /**
35
+ * Добавить виртуальный столбец (не будет учтён в запросах, но будет передан на бек для кастомизации фильтров)
36
+ * @param ColumnName
37
+ * @param mergingOpts
38
+ */
39
+ public addVirtual(ColumnName: string, mergingOpts: IColumn) {
40
+ this.columnsOpts[ColumnName] = new Column as any
41
+ merge(this.columnsOpts[ColumnName], mergingOpts)
42
+ this.columnsOpts[ColumnName].isVirtual = true;
43
+ }
44
+
29
45
  public set(ColumnName: string, mergingOpts: IColumn) {
30
46
  // TODO: ЕСТЬ ОШИБКА???
31
47
  if (this.columnsOpts[ColumnName] === undefined) this.columnsOpts[ColumnName] = new Column as any
package/src/store.ts CHANGED
@@ -16,7 +16,7 @@ export const storeFile = defineStore('store', {
16
16
 
17
17
  Table: {
18
18
  rows: {}
19
- }
19
+ },
20
20
 
21
21
  }
22
22
  },