<div id="acq-search-form" class="pl-3 pr-3 pt-3 pb-3">
+<div class="row mb-1">
+ <div class="col-lg-5 form-group form-inline">
+ <label i18n>Search for records matching
+ <select class="form-inline ml-1 mr-1" id="acq-search-conjunction" [ngModelOptions]="{standalone: true}" [(ngModel)]="searchConjunction">
+ <option i18n select value="all">all</option>
+ <option i18n select value="any">any</option>
+ </select>
+ of the following terms:</label>
+ </div>
+</div>
<div class="row mb-1" *ngFor="let t of searchTerms; let idx=index">
<div class="col-lg-3">
<select class="form-control" id="selected-search-term" [ngModelOptions]="{standalone: true}" [(ngModel)]="t.field"
import {StaffCommonModule} from '@eg/staff/common.module';
import {IdlService, IdlObject} from '@eg/core/idl.service';
import {PcrudService} from '@eg/core/pcrud.service';
-import {AcqSearchTerm} from './acq-search.service';
+import {AcqSearchTerm, AcqSearch} from './acq-search.service';
import {ServerStoreService} from '@eg/core/server-store.service';
@Component({
@Input() initialSearchTerms: AcqSearchTerm[] = [];
@Input() defaultSearchSetting = '';
- @Output() searchSubmitted = new EventEmitter<AcqSearchTerm[]>();
+ @Output() searchSubmitted = new EventEmitter<AcqSearch>();
hints = ['jub', 'acqpl', 'acqpo', 'acqinv', 'acqlid'];
availableSearchFields = {};
searchFieldLinkedClasses = {};
validSearchTypes = ['lineitems', 'purchaseorders', 'invoices', 'selectionlists'];
defaultSearchType = 'lineitems';
+ searchConjunction = 'all';
searchTerms: AcqSearchTerm[] = [];
this.store.getItem(this.defaultSearchSetting).then(
defaultSearch => {
if (defaultSearch) {
- this.searchTerms = JSON.parse(JSON.stringify(defaultSearch));
+ this.searchTerms = JSON.parse(JSON.stringify(defaultSearch.terms));
+ this.searchConjunction = defaultSearch.conjunction;
this.submitSearch();
} else {
this.addSearchTerm();
}
submitSearch() {
- this.searchSubmitted.emit(this.searchTerms);
+ this.searchSubmitted.emit({
+ terms: this.searchTerms,
+ conjunction: this.searchConjunction
+ });
}
saveSearchAsDefault() {
- return this.store.setItem(this.defaultSearchSetting, this.searchTerms);
+ return this.store.setItem(this.defaultSearchSetting, {
+ terms: this.searchTerms,
+ conjunction: this.searchConjunction
+ });
}
}
is_date?: boolean;
}
+export interface AcqSearch {
+ terms: AcqSearchTerm[];
+ conjunction: string;
+}
+
@Injectable()
export class AcqSearchService {
_terms: AcqSearchTerm[] = [];
+ _conjunction = 'all';
constructor(
private net: NetService,
) {
}
- setSearchTerms(terms: AcqSearchTerm[]) {
- this._terms = terms;
+ setSearch(search: AcqSearch) {
+ this._terms = search.terms;
+ this._conjunction = search.conjunction;
}
generateAcqSearch(searchType, filters): any {
- const baseSearch = JSON.parse(JSON.stringify(defaultSearch[searchType])); // deep copy
+ const andTerms = JSON.parse(JSON.stringify(defaultSearch[searchType])); // deep copy
+ const orTerms = {};
const coreRecType = Object.keys(defaultSearch[searchType])[0];
// handle supplied search terms
if (term.op !== '') {
searchTerm[term.op] = true;
}
- if (!(recType in baseSearch)) {
- baseSearch[recType] = [];
- }
if (term.is_date) {
searchTerm['__castdate'] = true;
}
- baseSearch[recType].push(searchTerm);
+ if (this._conjunction === 'any') {
+ if (!(recType in orTerms)) {
+ orTerms[recType] = [];
+ }
+ orTerms[recType].push(searchTerm);
+ } else {
+ if (!(recType in andTerms)) {
+ andTerms[recType] = [];
+ }
+ andTerms[recType].push(searchTerm);
+ }
});
// handle grid filters
if (filterOp in operatorMap) {
searchTerm[operatorMap[filterOp]] = true;
}
- baseSearch[coreRecType].push(searchTerm);
+ andTerms[coreRecType].push(searchTerm);
});
});
- console.debug(baseSearch);
- return baseSearch;
+ console.debug(andTerms);
+ return { andTerms: andTerms, orTerms: orTerms };
}
getAcqSearchDataSource(searchType: string): GridDataSource {
'open-ils.acq',
'open-ils.acq.' + searchType + '.unified_search',
this.auth.token(),
- currentSearch,
- null,
+ currentSearch.andTerms,
+ currentSearch.orTerms,
null,
opts
);
import {AuthService} from '@eg/core/auth.service';
import {GridComponent} from '@eg/share/grid/grid.component';
import {GridDataSource} from '@eg/share/grid/grid';
-import {AcqSearchService, AcqSearchTerm} from './acq-search.service';
+import {AcqSearchService, AcqSearchTerm, AcqSearch} from './acq-search.service';
import {AcqSearchFormComponent} from './acq-search-form.component';
@Component({
);
}
- doSearch(terms: AcqSearchTerm[]) {
- this.acqSearch.setSearchTerms(terms);
+ doSearch(search: AcqSearch) {
+ this.acqSearch.setSearch(search);
this.invoiceResultsGrid.reload();
}
}
import {AuthService} from '@eg/core/auth.service';
import {GridComponent} from '@eg/share/grid/grid.component';
import {GridDataSource} from '@eg/share/grid/grid';
-import {AcqSearchService, AcqSearchTerm} from './acq-search.service';
+import {AcqSearchService, AcqSearchTerm, AcqSearch} from './acq-search.service';
import {AcqSearchFormComponent} from './acq-search-form.component';
@Component({
this.gridSource = this.acqSearch.getAcqSearchDataSource('lineitem');
}
- doSearch(terms: AcqSearchTerm[]) {
- this.acqSearch.setSearchTerms(terms);
+ doSearch(search: AcqSearch) {
+ this.acqSearch.setSearch(search);
this.lineitemResultsGrid.reload();
}
}
import {PermService} from '@eg/core/perm.service';
import {GridComponent} from '@eg/share/grid/grid.component';
import {GridDataSource} from '@eg/share/grid/grid';
-import {AcqSearchService, AcqSearchTerm} from './acq-search.service';
+import {AcqSearchService, AcqSearchTerm, AcqSearch} from './acq-search.service';
import {PicklistCreateDialogComponent} from './picklist-create-dialog.component';
import {PicklistCloneDialogComponent} from './picklist-clone-dialog.component';
import {PicklistDeleteDialogComponent} from './picklist-delete-dialog.component';
this.picklistMergeDialog.update(); // update the dialog UI with selections
}
- doSearch(terms: AcqSearchTerm[]) {
- this.acqSearch.setSearchTerms(terms);
+ doSearch(search: AcqSearch) {
+ this.acqSearch.setSearch(search);
this.picklistResultsGrid.reload();
}
}
import {AuthService} from '@eg/core/auth.service';
import {GridComponent} from '@eg/share/grid/grid.component';
import {GridDataSource} from '@eg/share/grid/grid';
-import {AcqSearchService, AcqSearchTerm} from './acq-search.service';
+import {AcqSearchService, AcqSearchTerm, AcqSearch} from './acq-search.service';
import {AcqSearchFormComponent} from './acq-search-form.component';
@Component({
this.gridSource = this.acqSearch.getAcqSearchDataSource('purchase_order');
}
- doSearch(terms: AcqSearchTerm[]) {
- this.acqSearch.setSearchTerms(terms);
+ doSearch(search: AcqSearch) {
+ this.acqSearch.setSearch(search);
this.purchaseOrderResultsGrid.reload();
}
}