mirror of
https://github.com/frappe/books.git
synced 2025-01-22 14:48:25 +00:00
incr: update AutoComplete
This commit is contained in:
parent
6accde0e17
commit
b3533698c0
@ -133,15 +133,6 @@ export class DocHandler {
|
||||
return doc;
|
||||
}
|
||||
|
||||
getModel(schemaName: string): typeof Doc {
|
||||
const Model = this.models[schemaName];
|
||||
if (Model === undefined) {
|
||||
return Doc;
|
||||
}
|
||||
|
||||
return Model;
|
||||
}
|
||||
|
||||
async getSingle(schemaName: string) {
|
||||
return await this.getDoc(schemaName, schemaName);
|
||||
}
|
||||
@ -169,13 +160,17 @@ export class DocHandler {
|
||||
schema?: Schema,
|
||||
Model?: typeof Doc
|
||||
): Doc {
|
||||
Model ??= this.getModel(schemaName);
|
||||
if (!this.models[schemaName] && Model) {
|
||||
this.models[schemaName] = Model;
|
||||
}
|
||||
|
||||
Model ??= this.models[schemaName];
|
||||
schema ??= this.fyo.schemaMap[schemaName];
|
||||
if (schema === undefined) {
|
||||
throw new Error(`Schema not found for ${schemaName}`);
|
||||
}
|
||||
|
||||
const doc = new Model(schema, data, this.fyo);
|
||||
const doc = new Model!(schema, data, this.fyo);
|
||||
doc.setDefaults();
|
||||
return doc;
|
||||
}
|
||||
|
@ -31,9 +31,9 @@ export type FormulaMap = Record<string, Formula | undefined>;
|
||||
export type DefaultMap = Record<string, Default | undefined>;
|
||||
export type ValidationMap = Record<string, Validation | undefined>;
|
||||
export type RequiredMap = Record<string, Required | undefined>;
|
||||
export type CurrenciesMap = Record<string, GetCurrency>;
|
||||
export type HiddenMap = Record<string, Hidden>;
|
||||
export type ReadOnlyMap = Record<string, ReadOnly>;
|
||||
export type CurrenciesMap = Record<string, GetCurrency | undefined>;
|
||||
export type HiddenMap = Record<string, Hidden | undefined>;
|
||||
export type ReadOnlyMap = Record<string, ReadOnly | undefined>;
|
||||
export type DependsOnMap = Record<string, string[]>;
|
||||
|
||||
/**
|
||||
@ -57,7 +57,7 @@ export type EmptyMessageFunction = (doc: Doc, fyo: Fyo) => string;
|
||||
export type EmptyMessageMap = Record<string, EmptyMessageFunction>;
|
||||
|
||||
export type ListFunction = (doc?: Doc) => string[];
|
||||
export type ListsMap = Record<string, ListFunction>;
|
||||
export type ListsMap = Record<string, ListFunction | undefined>;
|
||||
|
||||
export interface Action {
|
||||
label: string;
|
||||
|
@ -32,9 +32,10 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Dropdown from 'src/components/Dropdown';
|
||||
import Dropdown from 'src/components/Dropdown.vue';
|
||||
import { fuzzyMatch } from 'src/utils';
|
||||
import Base from './Base';
|
||||
import { getOptionList } from 'src/utils/doc';
|
||||
import Base from './Base.vue';
|
||||
|
||||
export default {
|
||||
name: 'AutoComplete',
|
||||
@ -83,26 +84,13 @@ export default {
|
||||
},
|
||||
async getSuggestions(keyword = '') {
|
||||
keyword = keyword.toLowerCase();
|
||||
|
||||
let list = this.df.getList
|
||||
? await this.df.getList(this.doc)
|
||||
: this.df.options || [];
|
||||
|
||||
let items = list.map((d) => {
|
||||
if (typeof d === 'string') {
|
||||
return {
|
||||
label: d,
|
||||
value: d,
|
||||
};
|
||||
}
|
||||
return d;
|
||||
});
|
||||
const options = getOptionList(this.df, this.doc);
|
||||
|
||||
if (!keyword) {
|
||||
return items;
|
||||
return options;
|
||||
}
|
||||
|
||||
return items
|
||||
return options
|
||||
.map((item) => ({ ...fuzzyMatch(keyword, item.value), item }))
|
||||
.filter(({ isMatch }) => isMatch)
|
||||
.sort((a, b) => a.distance - b.distance)
|
||||
|
@ -1,5 +1,6 @@
|
||||
import Doc from 'fyo/model/doc';
|
||||
import { Field } from 'schemas/types';
|
||||
import { Field, OptionField, SelectOption } from 'schemas/types';
|
||||
import { fyo } from 'src/initFyo';
|
||||
|
||||
export function evaluateReadOnly(field: Field, doc: Doc) {
|
||||
if (field.readOnly !== undefined) {
|
||||
@ -26,3 +27,35 @@ export function evaluateHidden(field: Field, doc: Doc) {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
export function getOptionList(field: Field, doc: Doc): SelectOption[] {
|
||||
const list = _getOptionList(field, doc);
|
||||
return list.map((option) => {
|
||||
if (typeof option === 'string') {
|
||||
return {
|
||||
label: option,
|
||||
value: option,
|
||||
};
|
||||
}
|
||||
|
||||
return option;
|
||||
});
|
||||
}
|
||||
|
||||
function _getOptionList(field: Field, doc: Doc) {
|
||||
if ((field as OptionField).options) {
|
||||
return (field as OptionField).options;
|
||||
}
|
||||
|
||||
const Model = fyo.models[doc.schemaName];
|
||||
if (Model === undefined) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const getList = Model.lists[field.fieldname];
|
||||
if (getList === undefined) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return getList(doc);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user